Java 管理如何在RecyclerView中回收视图

Java 管理如何在RecyclerView中回收视图,java,android,android-recyclerview,Java,Android,Android Recyclerview,我正在寻找一种方法,在一个RecyclerView中过滤我的数据,而在应用过滤器时,给定视图的状态不会影响另一个视图。实际上,我有一个问题: 1.我通过点击add按钮(image msSxq.png)将“Martins”添加到我的好友列表中 不带过滤器的列表 我执行了一次搜索,得到了以下结果(图像FGSwF.png): 执行搜索操作后的列表 很明显,随着清理操作的完成,我的列表内容会发生变化,然后新项目会取代旧项目并取代旧项目按钮状态 我正在寻找一种方法来避免这种情况。我试着读了几篇关于类似

我正在寻找一种方法,在一个RecyclerView中过滤我的数据,而在应用过滤器时,给定视图的状态不会影响另一个视图。实际上,我有一个问题: 1.我通过点击add按钮(image msSxq.png)将“Martins”添加到我的好友列表中 不带过滤器的列表

  • 我执行了一次搜索,得到了以下结果(图像FGSwF.png): 执行搜索操作后的列表
  • 很明显,随着清理操作的完成,我的列表内容会发生变化,然后新项目会取代旧项目并取代旧项目按钮状态

    我正在寻找一种方法来避免这种情况。我试着读了几篇关于类似主题的帖子,但什么也没读(链接示例:)

    谢谢你的帮助

    编辑:2020年2月7日-onBindViewHolder和过滤代码

    onBindViewHolder(在我的自定义适配器中)

    筛选方法(始终在我的适配器中)


    最后,我试图深入了解recyclerview的工作原理,并找到了一个完美的解决方案。事实上,当我们在链接到recyclerview的searchview中过滤数据时,最后一个在不必要的情况下,会回收已经创建的视图并简单地更改其内容。为了避免这种情况,我们必须为创建的每个视图创建一个唯一的标识符,并告诉我们的recyclerview拥有唯一的视图ID。实际上,我做了这些事情:

    在我的数据模型中,我创建了一个方法,该方法为创建的每个实例生成一个唯一的Id,如下所示:

    public class MyDataModel {
        private long mId;
        ...//others variables here
    
        private long computeId(.../*some parameters if needed*/) {
            // write code here to generate your unique code
            return result;
        }
    
        public long getmId() {
            return this.mId;
        }
    
    然后,在适配器中重写getItemId()方法

    并且,我总是在适配器的构造函数中添加以下代码行:

    this.setHasStableIds(true);
    

    就这些

    OnBindViewHolder
    发布您的代码,然后进行搜索code@COYG我刚刚更新了帖子!
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }
    
            @Override
            public boolean onQueryTextChange(String newText) {
                if (adapter.getCompleteItemList() != null) {
                    adapter.getFilter().filter(newText);
                }
                return false;
            }
        });
    
    public class MyDataModel {
        private long mId;
        ...//others variables here
    
        private long computeId(.../*some parameters if needed*/) {
            // write code here to generate your unique code
            return result;
        }
    
        public long getmId() {
            return this.mId;
        }
    
    @override public long getItemId(int position) {
        return myDataList.get(position).getmId();
    }
    
    this.setHasStableIds(true);