首页 > 解决方案 > 隐藏/显示 Recyclerview 的行有效,但需要太多时间

问题描述

如果在其 onBindViewHolder 函数中出现类似这样的代码的情况,我正在尝试从 recyclerview 隐藏某些行:

 if (condition)
        {
            holder.mView.setVisibility(View.VISIBLE);
        }
        else {
            holder.mView.setVisibility(View.GONE);
            ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
            params.height = 0;
            params.width = 0;
            holder.itemView.setLayoutParams(params);
        }

该代码确实根据条件成功隐藏/显示了行,但是只需几秒钟就可以成功显示仅包含 21 行的 recyclerview 中的行,实际上,当 recyclerview 条件的每一行都为真并且它执行时,它需要更少的时间对于每一个holder.mView.setVisibility(View.VISIBLE) ;

所以执行这段代码:

 ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
            params.height = 0;
            params.width = 0;
            holder.itemView.setLayoutParams(params);

对于手机来说是非常昂贵的。

有什么方法可以使用可以更快执行的代码来实现相同的效果来隐藏/显示行?

标签: javaandroidandroid-recyclerview

解决方案


正如其他人在评论中提到的那样,您不应该以这种方式过滤您的 RecyclerView,原因如下:

回收者视图的工作原理是只根据需要膨胀尽可能多的视图。因此,如果屏幕上只有 8 个视图可见,它只会增加 10 个视图,以便滚动看起来不错。它将回收屏幕外的视图并用新数据重新绑定它们。

现在,如果您通过将视图的可见性设置为消失来过滤列表,那么回收器视图将无法回收此视图,因为它在技术上仍位于屏幕的可见部分,因此它必须膨胀更多视图,以显示其他项目。通过仅将过滤后的数据绑定到回收器视图,它不必创建太多视图,因此效率更高。

所以,是的,正如其他人所提到的,您应该真正过滤您的数据,并让回收者视图处理其余部分。这种方式会更加高效。


推荐阅读