Как сохранить историю поиска в приложение?
В своем приложение я использую библиотеку MaterialSearchBar Проблема в том что пока я нахожусь в приложение, история поиска отображается, но как только я выхожу она пропадает. Пробовал сохранять всё с помощью SharedPreferences, но у меня нечего не отображается. Так же есть три лога: save, saves и load, последний не отображается вообще.
public class MainActivity extends AppCompatActivity implements MaterialSearchBar.OnSearchActionListener {
private MaterialSearchBar searchBar;
private List<String> lastSearches;
ArrayList<SaveSearchModel> arrayList;
String SAVE = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
searchBar = findViewById(R.id.search);
searchBar.setHint("Your product");
searchBar.setSpeechMode(true);
searchBar.setOnSearchActionListener(this);
loadSearchSuggestionFromDisk();
try {
saveSearchSuggestionToDisk(searchBar.getLastSuggestions().toString());
} catch(Exception e) {
e.printStackTrace();
}
}
// Saved search history
private void saveSearchSuggestionToDisk(String search) {
SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("DATA", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
Gson gson = new Gson();
arrayList.add(new SaveSearchModel(search));
String json = gson.toJson(arrayList);
editor.putString("search_data", json);
editor.apply();
loadSearchSuggestionFromDisk();
Log.e("save", search);
}
// Load search history
private void loadSearchSuggestionFromDisk() {
SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("DATA", MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString("search_data", null);
Type type = new TypeToken<ArrayList<SaveSearchModel>>() {}.getType();
arrayList = gson.fromJson(json, type);
if (arrayList != null) {
for(int i = 0; i < arrayList.size(); i++) {
searchBar.getLastSuggestions();
Log.e("load", String.valueOf(arrayList));
}
}
}
@Override
public void onSearchStateChanged(boolean b) {
String state = b ? "enable" : "disable";
Toast.makeText(this, "Search " + state, Toast.LENGTH_SHORT).show();
}
@Override
public void onSearchConfirmed(CharSequence charSequence) {
SAVE = charSequence.toString();
Log.e("saves", searchBar.getLastSuggestions().toString());
Toast.makeText(this, "Searching " + charSequence.toString() + " ...", Toast.LENGTH_SHORT).show();
}
@Override
public void onButtonClicked(int i) {
switch (i) {
case MaterialSearchBar.BUTTON_NAVIGATION:
Toast.makeText(MainActivity.this, "Button Nav ", Toast.LENGTH_SHORT).show();
break;
}
}
}
При ответе указанном ниже в тег load я получаю null а в тег save 2023-04-09 18:02:05.631 12134-12134/com.buratinoapps.materialsearchbarhistory E/saves: com.buratinoapps.materialsearchbarhistory.MainActivity$2@b234126
В коде изменил только метод loadSearchSuggestionFromDisk() проверка на null.
// Load search history
private List<String> loadSearchSuggestionFromDisk() {
SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("DATA", MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString("search_data", null);
Type type = new TypeToken<List<String>>() {}.getType();
List<String> lastSearches = gson.fromJson(json, type);
Log.e("load", String.valueOf(lastSearches));
if (lastSearches != null) {
return lastSearches;
} else {
return lastSearches = new List<String>() {
@Override
public int size() {
return 0;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean contains(@Nullable Object o) {
return false;
}
@NonNull
@Override
public Iterator<String> iterator() {
return null;
}
@NonNull
@Override
public Object[] toArray() {
return new Object[0];
}
@NonNull
@Override
public <T> T[] toArray(@NonNull T[] a) {
return null;
}
@Override
public boolean add(String s) {
return false;
}
@Override
public boolean remove(@Nullable Object o) {
return false;
}
@Override
public boolean containsAll(@NonNull Collection<?> c) {
return false;
}
@Override
public boolean addAll(@NonNull Collection<? extends String> c) {
return false;
}
@Override
public boolean addAll(int index, @NonNull Collection<? extends String> c) {
return false;
}
@Override
public boolean removeAll(@NonNull Collection<?> c) {
return false;
}
@Override
public boolean retainAll(@NonNull Collection<?> c) {
return false;
}
@Override
public void clear() {
}
@Override
public String get(int index) {
return null;
}
@Override
public String set(int index, String element) {
return null;
}
@Override
public void add(int index, String element) {
}
@Override
public String remove(int index) {
return null;
}
@Override
public int indexOf(@Nullable Object o) {
return 0;
}
@Override
public int lastIndexOf(@Nullable Object o) {
return 0;
}
@NonNull
@Override
public ListIterator<String> listIterator() {
return null;
}
@NonNull
@Override
public ListIterator<String> listIterator(int index) {
return null;
}
@NonNull
@Override
public List<String> subList(int fromIndex, int toIndex) {
return null;
}
};
}
}
При отладке log save я его не получаю в логах за то показывает лог saves E/saves: com.buratinoapps.materialsearchbarhistory.MainActivity$2@606f068
А при загрузке в логе load я получаю null, а так же если в моем коде я получал историю поиска до того как закрою приложение то теперь её вообще не выводит.
Ответы (1 шт):
Сохранять нужно в onDestroy(), а не в onCreate(), где поиск ещё даже не виден и тем более его трогали. И что-то непонятное вы делаете со списком при сохранении/восстановлении. Может я чего-то не так понял, но думаю это должно выглядеть так:
public class MainActivity extends AppCompatActivity implements MaterialSearchBar.OnSearchActionListener {
private MaterialSearchBar searchBar;
String SAVE = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
searchBar = findViewById(R.id.search);
searchBar.setHint("Your product");
searchBar.setSpeechMode(true);
searchBar.setOnSearchActionListener(this);
searchBar.setLastSuggestions(loadSearchSuggestionFromDisk());
}
@Override
protected void onDestroy() {
//save last queries to disk
saveSearchSuggestionToDisk(searchBar.getLastSuggestions());
super.onDestroy();
}
// Saved search history
private void saveSearchSuggestionToDisk(List<String> lastSearches) {
SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("DATA", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
Gson gson = new Gson();
String json = gson.toJson(lastSearches);
editor.putString("search_data", json);
editor.apply();
Log.e("save", lastSearches.toString());
}
// Load search history
private List<String> loadSearchSuggestionFromDisk() {
List<String> result = new ArrayList<>();
SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("DATA", MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString("search_data", null);
if (json != null) {
Type type = new TypeToken<List<String>>() {}.getType();
List<String> lastSearches = gson.fromJson(json, type);
result.addAll(lastSearches);
}
Log.e("load", String.valueOf(result));
return result;
}
@Override
public void onSearchStateChanged(boolean b) {
String state = b ? "enable" : "disable";
Toast.makeText(this, "Search " + state, Toast.LENGTH_SHORT).show();
}
@Override
public void onSearchConfirmed(CharSequence charSequence) {
SAVE = charSequence.toString();
Log.e("saves", searchBar.getLastSuggestions().toString());
Toast.makeText(this, "Searching " + charSequence.toString() + " ...", Toast.LENGTH_SHORT).show();
}
@Override
public void onButtonClicked(int i) {
switch (i) {
case MaterialSearchBar.BUTTON_NAVIGATION:
Toast.makeText(MainActivity.this, "Button Nav ", Toast.LENGTH_SHORT).show();
break;
}
}
}

