如何在滚动期间停止更改回收站视图中的项目数据

Posted

技术标签:

【中文标题】如何在滚动期间停止更改回收站视图中的项目数据【英文标题】:How to stop change data of items in recycler view during scrolling 【发布时间】:2021-10-06 08:15:03 【问题描述】:

在我的情况下,数据的初始加载是完美的,但是当我在某个位置滚动 recyclerView 时,即使状态不等于 1,textView 也是可见的。

adapter = new FirebaseRecyclerAdapter<Model, MyViewHolder>(Model.class,
                R.layout.layout_order_list,
                MyViewHolder.class,
                reference) 
            @Override
            protected void populateViewHolder(MyViewHolder viewHolder, Model model, int position) 
                viewHolder.textView.setText(model.getName());
                String status = model.getStatus();
                if(status.equals("1"))
                    viewHolder.btnStatus.setVisibility(View.GONE);
                    viewHolder.textView.setVisibility(View.VISIBLE);
                
          
;

回收站视图

        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(this);
        layoutManager.setReverseLayout(true);
        layoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(layoutManager);

【问题讨论】:

视图持有者在位置之间重复使用,因此您的populateViewHolder 必须考虑到viewHolder 之前可能已绑定到具有status == 1 的项目。您需要添加一个 else 案例,它将视图可见性恢复为默认值。 【参考方案1】:

您需要在 if 块之后添加一个 else 块,以考虑状态不等于 1 的位置。

populateViewHolder 函数为回收器视图中的每个视图运行,并且视图持有者被重用。

这里可能发生的情况是,对于一个这样的视图,最初 status = 1 并且您的“if”块执行,但对于其他 status != 1 的情况,没有“else”块来处理这种情况,并且当视图持有者被重用,textView 仍然可见。

if(status.equals("1"))
  viewHolder.btnStatus.setVisibility(View.GONE);
  viewHolder.textView.setVisibility(View.VISIBLE);
 else 
  viewHolder.btnStatus.setVisibility(View.VISIBLE);
  viewHolder.textView.setVisibility(View.GONE);

【讨论】:

以上是关于如何在滚动期间停止更改回收站视图中的项目数据的主要内容,如果未能解决你的问题,请参考以下文章

电视 dpad 焦点中的水平回收视图在快速滚动时循环

在顶部添加新项目后,回收器视图未滚动到顶部,因为尚未发生对列表适配器的更改

使用Android ViewPager2在回收器视图中滚动到底部时自动更改选项卡项

滚动回收站视图时如何防止项目重复

如何在第一个活动中更新回收站视图,同时更改其他活动中的数据?

每次重新创建滚动位置后,如何将滚动位置保存在回收站视图中?