首页 > 解决方案 > 当搜索栏中的文本写入Recyclerview android时调用notifyItemRangechanged

问题描述

每次用户animation在. 我已经实现了一个过滤项目的方法,但是调用失败,所以出现了。我已经尝试过这样的事情:RecyclerViewSearchBarFilternotifyItemrangechangedOnQuerytextChanged

@Override
                public boolean onQueryTextChange(String newText) {


                    istyping = true;

                    ArrayList<String> templist = new ArrayList<>();

                    mSearchQuery = newText;

 //this line -->   adapter.notifyItemRangeChanged(0, namelistwithnumber.size());    <---



                    for (String temp : namelistwithnumber) {
                        if (temp.toLowerCase().contains(newText.toLowerCase())) {
                            templist.add(temp);
                        }
                    }

                    if (newText.isEmpty()){
                        mainlist.setAdapter(null);
                        adapter = new MyRecyclerViewAdapter(MainActivity.this, namelist);
                        mainlist.setAdapter(adapter);
                        adapter.notifyDataSetChanged();
                        istyping = false;
                    }

                    if (templist.size() == 0) {
                        mainlist.setAdapter(null);
                        noresults.setVisibility(View.VISIBLE);
                    } else {
                        if (!newText.isEmpty()){
                          adapter = new MyRecyclerViewAdapter(MainActivity.this, templist);
                            mainlist.setAdapter(adapter);
                            noresults.setVisibility(View.INVISIBLE);
                            adapter.setClickListener(MainActivity.this);

                        }
                        noresults.setVisibility(View.INVISIBLE);
                    }

                    return true;
                }

这就是我想要实现的目标:

动画片

任何帮助表示赞赏!

标签: androidanimationandroid-recyclerviewsearchviewnotify

解决方案


新浪的回答似乎不错,它有很好的做法(除了冗余数据绑定),但由于你不接受它,我假设你不想用那些额外的概念重写你的代码。所以这是一个简单的解决方案:

  • 设置setHasStableIds(true)为适配器
  • 覆盖getItemId(int position)内部适配器
  • 添加DefaultItemAnimator()到 RecyclerView

分步指南:

1. 添加默认 itemAnimator 到你的 RecyclerView

mainlist.setItemAnimator(new DefaultItemAnimator());

2. 适配器增加列表更新功能

MyRecyclerViewAdapter每次更改项目列表时都不应该重新初始化。从构造函数中删除列表!而是在您的适配器类中声明成员 varialbe 并向List<NameListwithNumber> nameListWithNumber = new ArrayList<>(); 您的适配器添加一个函数:

public void setItems(List<NameListwithNumber> newItems){
nameListWithNumber.clear();
nameListWithNumber.addAll(newItems);
notifydatasetChanged();
}

3.初始化适配器并设置setHasStableIds(true)

在您Activity将适配器声明为全局变量

private MyRecyclerViewAdapter  myAdapter;

(我不确定你为什么需要在适配器内的活动实例)

onCreate()并在方法内初始化它

 myAdapter = new MyRecyclerViewAdapter(MainActivity.this);
 myAdapter.setHasStableIds(true);
 mainList.setAdapter(myAdapter);

4. 覆盖适配器内部的 getItemId(int position)

在您的适配器内添加此功能:

@Override
public long getItemId(int position) {
   return nameListWithNumber.get(position).id;
}

如果您的模型没有唯一的 id ,请使用return nameListWithNumber.get(position).hashCode();


最后 在你里面public boolean onQueryTextChange(String newText) 你需要改变

  if (newText.isEmpty()) {
       adapter.setItems(nameList)
       istyping = false;
    }
  else {
    adapter.setItems(tempList)
    noresults.setVisibility(templist.size() == 0 ? View.VISIBLE : View.INVISIBLE)
}

这是完全相同方法的结果,只是过滤方式不同。

在此处输入图像描述


推荐阅读