При нажатии на кнопку поиска, открывается фрагмент, где сверху editText и под ним recyclerView. Все работает, но при открытии фрагмента он пустой, а нужно чтоб сначала выводились все элементы списка, которые при наборе заголовка будут динамически фильтроваться.
dataDao
@Query("SELECT * FROM Data WHERE title LIKE :search")
List<Data> getAllSearch(String search);
ViewModel
public class DataViewModelSearch extends AndroidViewModel {
public MutableLiveData<List<Data>> searchData = new MutableLiveData<>();
private DataRepository repository;
public DataViewModelSearch(@NonNull Application application) {
super(application);
repository = new DataRepository(application);
}
public void refresh(String searchText) {
String formattedSearchText = "%" + searchText + "%";
new GetSearchDataTask().execute(formattedSearchText);
}
@SuppressLint("StaticFieldLeak")
private class GetSearchDataTask extends AsyncTask<String, Void, List<Data>> {
@Override
protected List<Data> doInBackground(String... params) {
return repository.getAllSearch(params[0]);
}
@Override
protected void onPostExecute(List<Data> data) {
super.onPostExecute(data);
searchData.setValue(data);
}
}
}
fragment
dataListViewModel = ViewModelProviders.of(this).get(DataListViewModel.class);
dataListViewModel.searchData.observe(this, new Observer<List<Data>>() {
@Override
public void onChanged(List<Data> data) {
adapter.setData(data);
}
});
etFilter.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
dataListViewModel.refresh(charSequence.toString());
}
@Override
public void afterTextChanged(Editable editable) {
}
});
код фрагмента, где расположена кнопка
btnSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SearchFragment searchFragment = new SearchFragment();
FragmentManager fragmentManager = getFragmentManager();
if (fragmentManager != null) {
fragmentManager.beginTransaction().add(R.id.content_frame,
searchFragment).addToBackStack(null).commit();
}
}
});
SELECT * FROM Data WHERE title LIKE :search + "%"- процент задает нечеткий поиск - все строки, начинающиеся со строкиsearch(при пустой строке search это вся выборка), но я не уверен, что в Room именно так можно добавить символ к передающейся в запрос строке. Еще по похожему вопросу – pavlofff Mar 15 '19 at 01:33DataViewModelSearchсделатьrefreshс пустой строкой? Например, прямо в конструкторе или во фрагменте после создания экземпляраdataListViewModel. Просто у вас запрос к БД выполняется только после ввода фильтра – Vasil Baymurzin Mar 15 '19 at 05:50dataListViewModel.refresh("");Спасибо! – GregorSa Mar 15 '19 at 09:45