I am trying to implement the SearchView
from the support library. I want the user to be to use the SearchView
to filter a List
of movi
With Android Architecture Components through the use of LiveData this can be easily implemented with any type of Adapter. You simply have to do the following steps:
1. Setup your data to return from the Room Database as LiveData as in the example below:
@Dao
public interface CustomDAO{
@Query("SELECT * FROM words_table WHERE column LIKE :searchquery")
public LiveData> searchFor(String searchquery);
}
2. Create a ViewModel object to update your data live through a method that will connect your DAO and your UI
public class CustomViewModel extends AndroidViewModel {
private final AppDatabase mAppDatabase;
public WordListViewModel(@NonNull Application application) {
super(application);
this.mAppDatabase = AppDatabase.getInstance(application.getApplicationContext());
}
public LiveData> searchQuery(String query) {
return mAppDatabase.mWordDAO().searchFor(query);
}
}
3. Call your data from the ViewModel on the fly by passing in the query through onQueryTextListener as below:
Inside onCreateOptionsMenu
set your listener as follows
searchView.setOnQueryTextListener(onQueryTextListener);
Setup your query listener somewhere in your SearchActivity class as follows
private android.support.v7.widget.SearchView.OnQueryTextListener onQueryTextListener =
new android.support.v7.widget.SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
getResults(query);
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
getResults(newText);
return true;
}
private void getResults(String newText) {
String queryText = "%" + newText + "%";
mCustomViewModel.searchQuery(queryText).observe(
SearchResultsActivity.this, new Observer>() {
@Override
public void onChanged(@Nullable List words) {
if (words == null) return;
searchAdapter.submitList(words);
}
});
}
};
Note: Steps (1.) and (2.) are standard AAC ViewModel and DAO implementation, the only real "magic" going on here is in the OnQueryTextListener which will update the results of your list dynamically as the query text changes.
If you need more clarification on the matter please don't hesitate to ask. I hope this helped :).