我正在做一个聊天布局,我需要两个"不同"的布局来发送&收到消息。这两种布局几乎是相同的,所以有可能只有一个,并动态地改变它的背景和一些重力/margin/padding属性。
使用RecyclerView后,我对效率有疑问。为了实现我的目标,我看到了两种方法:
- 使用1视图并在onBindViewHolder()中以编程方式修改
- 使用2种视图类型
- ¿有更有效的方法吗?
在搜索了一下之后,我不确定什么是最好和最有效的方法,所以一些专家的建议会很好。谢谢你。
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,但我不确定它有多便宜,这取决于你的可绘制。如果成本太高,你可以手动回收这些背景画。