How to filter a RecyclerView with a SearchView

后端 未结 11 1863
孤独总比滥情好
孤独总比滥情好 2020-11-22 00:28

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

11条回答
  •  误落风尘
    2020-11-22 00:31

    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 :).

提交回复
热议问题