如何过滤ListAdapter?

问题描述 投票:0回答:1

我有一个由 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 filter android-recyclerview listadapter
1个回答
0
投票

如果您使用 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 方法依赖于此方法。

此更改可能会帮助您解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.