java - 隐藏/显示 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);
对于手机来说是非常昂贵的。
有什么方法可以使用可以更快执行的代码来实现相同的效果来隐藏/显示行?
解决方案
正如其他人在评论中提到的那样,您不应该以这种方式过滤您的 RecyclerView,原因如下:
回收者视图的工作原理是只根据需要膨胀尽可能多的视图。因此,如果屏幕上只有 8 个视图可见,它只会增加 10 个视图,以便滚动看起来不错。它将回收屏幕外的视图并用新数据重新绑定它们。
现在,如果您通过将视图的可见性设置为消失来过滤列表,那么回收器视图将无法回收此视图,因为它在技术上仍位于屏幕的可见部分,因此它必须膨胀更多视图,以显示其他项目。通过仅将过滤后的数据绑定到回收器视图,它不必创建太多视图,因此效率更高。
所以,是的,正如其他人所提到的,您应该真正过滤您的数据,并让回收者视图处理其余部分。这种方式会更加高效。
推荐阅读
- java - 如何使用 Thymeleaf 读取 HTML 中的列表
- objective-c - NSTableView 删除表格视图边框和单元格之间的填充/空格
- python - 我应该在 Pycharm 中使用什么文件夹?
- reactjs - Microsoft Graph Toolkit - 如何使用 React 和默认模板循环获取组件结果
- c - 迭代中的Qsort?
- android - gradlew assembleRelease 抛出 compileSdkVersion is not specified 错误
- flutter - 颤振:使用中心小部件覆盖最小宽度
- python - 数据透视表中的 Python 列标题
- angular - Angular:不要在特定的动态 slug 上显示页眉和页脚
- java - 如何使用 picocli 处理多种类型的选项