使用搜索视图搜索后,adapter.notifyDataSetChanged不起作用

时间:2016-11-11 08:11:04

标签: android android-recyclerview

我有一个搜索视图,过滤回收者查看项目;它正确过滤项目,但当我关闭搜索视图时,我的适配器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;
}

但我的回收者视图中仍未发生任何变化

2 个答案:

答案 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的适配器。

这同样适用于您的getFiltersetFilter()。适配器使用wordList = new WordList()丢失了您的wordlist上的引用。

尝试使用:

wordList.clear();

并没有重新创建适配器。但只能更改列表内容。