提问人:Abdelrahman Mahmoud Nasr 提问时间:11/12/2023 最后编辑:Abdelrahman Mahmoud Nasr 更新时间:11/12/2023 访问量:39
如何过滤ListAdapter?
How to filter ListAdapter?
问:
我有一个由 ListAdapter 扩展的适配器,我使用提交列表来更新 ui,但是当我使用它时,当用户更改搜索查询时,它会在列表中显示其他 I 项,但是当我记录过滤列表时,它是正确的,过滤的项目是正确的。
以下是我如何过滤列表并将其提交到适配器:
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (newText.equals("")) {
refreshData();
} else {
List<Teacher> list = new ArrayList<>(originalList.stream().filter(item -> item.name.toLowerCase().trim().contains(newText.toLowerCase().trim())).collect(Collectors.toList()));
if (!teachersAdapter.getCurrentList().equals(list)) {
teachersAdapter.submitList(null);
teachersAdapter.submitList(list);
if (!teachersAdapter.getCurrentList().equals(list)) {
teachersAdapter.submitList(null);
teachersAdapter.submitList(list);
}
}
}
return false;
}
});
这是适配器的 DiffUtil
public TeachersAdapter(TeacherClicks teacherClicks) {
super(new DiffUtil.ItemCallback<Teacher>() {
@Override
public boolean areItemsTheSame(@NonNull Teacher oldItem, @NonNull Teacher newItem) {
return oldItem.id.equals(newItem.id);
}
@Override
public boolean areContentsTheSame(@NonNull Teacher oldItem, @NonNull Teacher newItem) {
return newItem.equals(oldItem) && newItem.toString().equals(oldItem.toString());
}
});
this.teacherClicks = teacherClicks;
}
这是导致的行为
我尝试了很多方法,但没有一个有效
答:
0赞
Davit Hovhannisyan
11/12/2023
#1
如果您使用 LiveData 来观察数据的变化,请确保使用 postValue 在主线程上更新它,如下所示:
MutableLiveData<List<Teacher>> liveDataList = new MutableLiveData<>();
List<Teacher> list = new ArrayList<>(originalList.stream().filter(item -> item.name.toLowerCase().trim().contains(newText.toLowerCase().trim())).collect(Collectors.toList()));
liveDataList.postValue(list);
此外,在提交新列表之前,您不需要调用 submitList(null),只需使用:
teachersAdapter.submitList(list);
此外,您需要像这样简化 areContentsTheSame 方法:
@Override
public boolean areContentsTheSame(@NonNull Teacher oldItem, @NonNull Teacher newItem) {
return true;
}
最后,检查您的“Teacher”类是否正确实现了 equals 方法。DiffUtil.ItemCallback 中的 areItemsTheSame 和 areContentsTheSame 方法依赖于此方法。
此更改可能有助于您解决问题。
评论
0赞
Abdelrahman Mahmoud Nasr
11/13/2023
对于 areContentsTheSame 我应该如何返回 true,即使项目的数据可能会更改,但不是所有项目,对于 submitList,我在提交时遇到了复制数据的错误,同样的问题提交 null 解决了它,但现在我被卡住了,谢谢你的帮助。
评论