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



我正在做一个聊天布局,我需要两个"不同"的布局来发送&收到消息。这两种布局几乎是相同的,所以有可能只有一个,并动态地改变它的背景和一些重力/margin/padding属性。

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

  1. 使用1视图并在onBindViewHolder()中以编程方式修改
  2. 使用2种视图类型
  3. ¿有更有效的方法吗?

在搜索了一下之后,我不确定什么是最好和最有效的方法,所以一些专家的建议会很好。谢谢你。

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

这个功能实际上是内置在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.
}

首先,衡量并看看这是否是一个值得努力的关键会话。

之后,合并类型通常是一个好做法,除非交换它们的代价很高。只是改变背景应该是好的。框架会改变一个已经缓存的可绘制id,但我不确定它有多便宜,这取决于你的可绘制。如果成本太高,你可以手动回收这些背景画。

相关内容

最新更新