如何过滤ListAdapter?

How to filter ListAdapter?

提问人:Abdelrahman Mahmoud Nasr 提问时间:11/12/2023 最后编辑:Abdelrahman Mahmoud Nasr 更新时间:11/12/2023 访问量:39

问:

我有一个由 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;
    }

这是导致的行为

结果

我尝试了很多方法,但没有一个有效

java 过滤器 android-recyclerview listadapter

评论


答:

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 解决了它,但现在我被卡住了,谢谢你的帮助。