呈现各种类型的单元格时,Recycler视图中的java性能问题
从回收商的角度来看,主要有3种类型的电池。我通过以下代码实现了这一点
final int TYPE_COMMENT = 10004;
final int TYPE_UPDATE = 10005;
final int TYPE_ACTIVITY = 10006;
public int getItemViewType(int position) {
if(activity.getActivity().getType().equalsIgnoreCase(CHECKIN_COMMENT_STRING)){
return TYPE_COMMENT;
}else if(activity.getActivity().getType().equalsIgnoreCase(CHECKIN_UPDATE_STRIND)){
return TYPE_UPDATE;
}else if(activity.getActivity().getType().equalsIgnoreCase(CHECKIN_HISTORY_STRING)){
return TYPE_ACTIVITY;
}
return TYPE_ACTIVITY;
}
然后,当我将第二个问题放大时,问题出现了。其布局复杂,主要由5个部分组成。每个单元格都有机会包含这5个部分的一个或组合(具有LinearLayout根,后面是一些复杂的小部件)。所以我做了研究,发现我们可以通过以下方法克服它
通过使用可见性(View.GONE),我可以隐藏/显示所需的零件
在视图存根中定义每个零件,并在需要时将其充气
通过编程将小部件添加到所需的部分(但我不建议这样做,因为视图非常复杂)
为每个零件组合定义单独的单元,但可能需要5个!电池设计是120个电池。所以不可能
你能不能建议哪种方法更好(或者建议其他方法),而性能是我的主要限制因素
# 1 楼答案
如果性能是目标,并且这些复杂布局的数量不是很高,那么我建议您不要回收复杂视图,即为每个视图分配不同的视图类型,然后在onCreateViewHolder中填充所有值,而不是在onBindViewHolder中。滚动将更加平滑
提示:
我在一个复杂的列表中使用了这个系统,它的布局包含许多小部件、文本视图、编辑框、seekbar和其他。它工作得很好,但有时会意外地对同一视图类型调用两次CreateViewHolder,这导致用户先前输入的数据丢失。最后,我使用已经创建的ViewHolder与viewType的映射来解决这个问题
Map<Integer, MyViewHolder> holderMap = new HashMap<>();
在onCreateViewHolder中,我返回previous holder(如果存在)希望能有所帮助