我有一个由 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;
}
这就是导致的行为
我尝试了很多方法,但都不起作用
如果您使用 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 方法依赖于此方法。
此更改可能会帮助您解决问题。