使用 Room 和 RecyclerView 在 SearchView 中添加过滤器
Posted
技术标签:
【中文标题】使用 Room 和 RecyclerView 在 SearchView 中添加过滤器【英文标题】:Add Filter in SearchView with Room and RecyleView 【发布时间】:2019-04-11 00:12:48 【问题描述】:(谷歌翻译)
简介: 我已经搜索过这个解决方案,但没有找到。如果有此问题的重复,请告诉我。谢谢。
问题: 我使用 Room 数据库和 RecycleView 创建了一个存储应用程序。然后我寻找将搜索添加到我的数据的方法。一切都很顺利,但有一个问题。 如果减少搜索词,则搜索仅限于可见数据。 (看截图)
-
Normal
Search is done (Normal)
Empty word
Search again and The result
GIF Image
希望你能理解。 请帮我。我看过很多教程,但没有任何效果。
谢谢
我的代码: 在我的适配器
中过滤public Filter getFilter()
return new Filter()
@Override
protected FilterResults performFiltering(CharSequence charSequence)
String charString = charSequence.toString();
List<Barang> filteredList = new ArrayList<>();
if (charString.isEmpty())
filteredList.addAll(namaBarang);
else
for (Barang row : namaBarang)
// name match condition. this might differ depending on your requirement
// here we are looking for name or phone number match
if (row.getNamaBarang().toLowerCase().contains(charString.toLowerCase()))
filteredList.add(row);
FilterResults filterResults = new FilterResults();
filterResults.values = filteredList;
return filterResults;
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults)
namaBarang = (ArrayList<Barang>) filterResults.values;
notifyDataSetChanged();
;
MainActivity
@Override
public boolean onCreateOptionsMenu(Menu menu)
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
final MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setOnQueryTextListener(this);
return true;
@Override
public boolean onQueryTextSubmit(String query)
adapter.getFilter().filter(query);
return false;
@Override
public boolean onQueryTextChange(String newText)
// t = newText.;
adapter.getFilter().filter(newText);
return false;
我的适配器中也有这个:
void setBarangs(List<Barang> barangs)
namaBarang = barangs;
notifyDataSetChanged();
【问题讨论】:
【参考方案1】:我的问题已经解决了:
@Override
public Filter getFilter()
return new Filter()
@Override
protected FilterResults performFiltering(CharSequence charSequence)
String charString = charSequence.toString();
List<Barang> listHasilFilter = new ArrayList<>();
List<Barang> listYgAkandiFilter = new ArrayList<>();
listYgAkandiFilter.addAll(namaBarangC);
if (charString.isEmpty())
listHasilFilter = listYgAkandiFilter;
// namaBarang = listYgAkandiFilter;
Log.d(TAG, "" + namaBarang.size());
else
for (Barang row : namaBarangC)
// name match condition. this might differ depending on your requirement
// here we are looking for name or phone number match
if (row.getNamaBarang().toLowerCase().contains(charString.toLowerCase()))
listHasilFilter.add(row);
FilterResults hasilFilter = new FilterResults();
hasilFilter.values = listHasilFilter;
return hasilFilter;
@Override
protected void publishResults(CharSequence charSequence, FilterResults hasilFilter)
namaBarang = (ArrayList<Barang>) hasilFilter.values;
notifyDataSetChanged();
;
谢谢
【讨论】:
以上是关于使用 Room 和 RecyclerView 在 SearchView 中添加过滤器的主要内容,如果未能解决你的问题,请参考以下文章
Android使用Room操作SQLite数据库让其变得无比高效和简洁(进一步完善用RecyclerView显示数据库中的数据)
如何使用 ROOM 库在不阻塞 UI 的情况下将数千条记录从本地数据库加载到 recyclerview
Android Room联合AsyncListUtil实现RecyclerView分页加载ORM数据