我有一个搜索视图,过滤回收者查看项目;它正确过滤项目,但当我关闭搜索视图时,我的适配器notifyDataSetChanged
不会工作,例如,如果我将新项目添加到回收站视图,直到我关闭应用程序并再次打开它。这是我过滤项目的代码。
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (TextUtils.isEmpty(newText)){
adapter.resetList(userData.GetAllWords(user.getId()));
} else {
final ArrayList<Word> filteredModelList = filter(wordlist, newText);
adapter.setfilter(filteredModelList);
}
return false;
}
private ArrayList<Word> filter(ArrayList<Word> wordlistt, String query) {
query = query.toLowerCase();
final ArrayList<Word> filteredModelList = new ArrayList<>();
for (Word myword : wordlistt) {
if (myword.getWord().contains(query) || myword.getTranslation().contains(query)) {
filteredModelList.add(myword);
}
}
return filteredModelList;
}
这是我在适配器中的代码
public void setfilter(ArrayList<Word> filteredwordlist) {
wordlist = new ArrayList<>();
wordlist.addAll(filteredwordlist);
notifyDataSetChanged();
}
public void resetList(ArrayList<Word> newWordlist){
wordlist=new ArrayList<>();
wordlist.addAll(newWordlist);
notifyDataSetChanged();
}
我甚至在搜索视图关闭时重置我的适配器
@Override
public boolean onMenuItemActionCollapse(MenuItem menuItem) {
adapter=new WordAdapter(MainActivity.this,userData.GetAllWords(user.getId()));
recyclerView.setAdapter(adapter);
return true;
}
但我的回收者视图中仍未发生任何变化
答案 0 :(得分:4)
你每次都在创建数组的对象,这意味着适配器没有相同的数据实例来通知这样做,只需在构造函数中创建一次wordlist对象,然后清除它并在其中添加项目。
public void setfilter(ArrayList<Word> filteredwordlist) {
//wordlist = new ArrayList<>();
wordlist.clear();
wordlist.addAll(filteredwordlist);
notifyDataSetChanged();
}
重置时也一样,
答案 1 :(得分:1)
如果执行此操作adapter=new WordAdapter(...);
,则RecyclerView会丢失适配器上的引用。而且您不再修改RecyclerView的适配器。
这同样适用于您的getFilter
和setFilter()
。适配器使用wordList = new WordList()
丢失了您的wordlist上的引用。
尝试使用:
wordList.clear();
并没有重新创建适配器。但只能更改列表内容。