繁体   English   中英

在Android RecyclerView中具有两种不同布局的最有效方法

[英]Most efficient way of having two different layouts in Android RecyclerView

我在聊天布局上工作,我需要两个“不同”的布局来发送和接收消息。 这两种布局几乎相同,因此可以只设置一种布局并动态更改其背景以及某些重力/边距/填充属性。

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

  1. 使用1个视图并在onBindViewHolder()中以编程方式对其进行修改
  2. 使用2种视图类型。
  3. 有什么更有效的方法吗?

经过一番搜索,我不确定什么是最好和最有效的方法,因此一些专家建议会很好。 谢谢。

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

此功能实际上内置于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,但是我不确定它的便宜程度取决于您的可绘制对象。 如果发现价格昂贵,则可以手动回收这些背景可绘制对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM