android - 当搜索栏中的文本写入Recyclerview android时调用notifyItemRangechanged
问题描述
每次用户animation
在. 我已经实现了一个过滤项目的方法,但是调用失败,所以出现了。我已经尝试过这样的事情:RecyclerView
SearchBar
Filter
notifyItemrangechanged
OnQuerytextChanged
@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;
}
这就是我想要实现的目标:
任何帮助表示赞赏!
解决方案
新浪的回答似乎不错,它有很好的做法(除了冗余数据绑定),但由于你不接受它,我假设你不想用那些额外的概念重写你的代码。所以这是一个简单的解决方案:
- 设置
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)
}
这是完全相同方法的结果,只是过滤方式不同。
推荐阅读
- python - 仅在一个文件中忽略“未使用的导入语句”(PyCharm)
- javascript - 复选框和单选按钮可从响应式触摸设备的外部区域单击,如何解决?
- c# - 针对 XSD 的 C# XML 验证如何工作?
- google-colaboratory - 在 colab 中访问已安装的谷歌驱动器上的文件时遇到问题
- tcl - TCL 脚本中的数组处理问题
- angular - Angular2 - 运行所有单元测试会失败一些单独通过的测试
- java - 防止 Android Studio Flutter 应用在拍照后关闭
- linux - 无法将 grep 用于命令并执行 shell 脚本?
- java - Optional.ifPresentOrElse 是否有任何编码风格指南?
- python - 如何只清除pyqt5中的图?