我在聊天布局上工作,我需要两个“不同”的布局,用于发送和放大收到消息。 2个布局几乎相同,因此只有一个布局可动态地改变其背景和一些重力/边距/填充属性。
使用RecyclerView后,我对效率有疑问。为了实现我的目标,我看到了两种方法:
在搜索了一下后,我不确定这里最好和最有效的方法是什么,所以一些专家建议会很好。谢谢。
PD:背景是9patch图像,在场景1中,我使用getResources()和setBackground()加载它们。旧设备上的滚动感觉有点慢。
答案 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。如果结果是昂贵的,你可以手动回收那些背景可绘制的。