有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

呈现各种类型的单元格时,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根,后面是一些复杂的小部件)。所以我做了研究,发现我们可以通过以下方法克服它

  1. 通过使用可见性(View.GONE),我可以隐藏/显示所需的零件

  2. 在视图存根中定义每个零件,并在需要时将其充气

  3. 通过编程将小部件添加到所需的部分(但我不建议这样做,因为视图非常复杂)

  4. 为每个零件组合定义单独的单元,但可能需要5个!电池设计是120个电池。所以不可能

    你能不能建议哪种方法更好(或者建议其他方法),而性能是我的主要限制因素

Image of 2nd type of cell


共 (1) 个答案

  1. # 1 楼答案

    如果性能是目标,并且这些复杂布局的数量不是很高,那么我建议您不要回收复杂视图,即为每个视图分配不同的视图类型,然后在onCreateViewHolder中填充所有值,而不是在onBindViewHolder中。滚动将更加平滑

    提示:

    我在一个复杂的列表中使用了这个系统,它的布局包含许多小部件、文本视图、编辑框、seekbar和其他。它工作得很好,但有时会意外地对同一视图类型调用两次CreateViewHolder,这导致用户先前输入的数据丢失。最后,我使用已经创建的ViewHolder与viewType的映射来解决这个问题Map<Integer, MyViewHolder> holderMap = new HashMap<>(); 在onCreateViewHolder中,我返回previous holder(如果存在)

    希望能有所帮助