在Android RecyclerView中拥有两种不同布局的最有效方式

时间:2015-05-15 19:00:37

标签: android android-recyclerview

我在聊天布局上工作,我需要两个“不同”的布局,用于发送和放大收到消息。 2个布局几乎相同,因此只有一个布局可动态地改变其背景和一些重力/边距/填充属性。

使用RecyclerView后,我对效率有疑问。为了实现我的目标,我看到了两种方法:

  1. 使用1视图并在onBindViewHolder()
  2. 中以编程方式修改它
  3. 使用2种视图类型。
  4. ¿任何更有效的方式?
  5. 在搜索了一下后,我不确定这里最好和最有效的方法是什么,所以一些专家建议会很好。谢谢。

    PD:背景是9patch图像,在场景1中,我使用getResources()和setBackground()加载它们。旧设备上的滚动感觉有点慢。

2 个答案:

答案 0 :(得分:0)

此功能实际上内置于RecyclerView中。您会注意到createViewHolder的方法签名是createViewHolder(ViewGroup parent, int viewType)viewType实际上就是您所需要的。要执行此操作,请覆盖getItemViewType,以便根据位置为发送或接收的消息返回不同的整数。这将允许您在createViewHolder中创建一个简单的switch语句来选择适当的视图类型。

@Override
public int getItemViewType(int position) {
        if(listOfMessages.get(position).isSentMessage())
           return 1;
        else
           return 2;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
        if(viewType == 1)
            //inflate sent message layout
        else if(viewType == 2)
            //inflate received message layout.
}

答案 1 :(得分:0)

首先,衡量并看看它是否值得努力。

在此之后,合并类型通常是一种很好的做法,除非交换它们的成本很高。只是改变背景应该没问题。框架将改变已经缓存的可绘制ID,但我不确定它的价格有多便宜,具体取决于你的drawable。如果结果是昂贵的,你可以手动回收那些背景可绘制的。