如果你需要对界面样式做更多定制化的需求,例如消息状态,设置已读标签等等,你可以使用自定义 ViewHolder 及布局。
自定义界面的样式只需要三个步骤:
在 layout 中创建你自己的布局文件。
自定义的 ViewHolder 类构造函数的两个参数类型必须为 View 以及 boolean。可以参考一下 messages 文件夹下的 ViewHolder 类。 例如:
public class TxtViewHolder<MESSAGE extends IMessage>
extends BaseMessageViewHolder<MESSAGE>
implements MsgListAdapter.DefaultMessageViewHolder {
public TxtViewHolder(View itemView, boolean isSender) {
super(itemView);
...
}
@Override
public void onBind(final MESSAGE message) {
...
}
@Override
public void applyStyle(MessageListStyle style) {
...
}
MsgListAdapter.HoldersConfig holdersConfig = new MsgListAdapter.HoldersConfig();
// 第一个参数是自定义的 ViewHolder 类,第二个是自定义布局文件的资源 id
holdersConfig.setSenderTxtMsg(CustomViewHolder.class, layoutRes);
holdersConfig.setReceiverTxtMsg(CustomViewHolder.class, layoutRes);
这样就完成了自定义界面。
新增 SEND_CUSTOM
和 RECEIVE_CUSTOM
消息类型。可以用 HoldersConfig
对象设置这两种自定义消息的布局和适配器:
MsgListAdapter.HoldersConfig holdersConfig = new MsgListAdapter.HoldersConfig();
holdersConfig.setSendCustomMsg(CustomMessageViewHolder.class, layoutRes);
holdersConfig.setReceiveCustomMsg(CustomMessageViewHolder.class, layoutRes);
支持多种自定义消息。使用方式如下:
- 构造自定义 Adapter 继承自
BaseMessageViewHolder
并实现DefaultMessageViewHolder
, 比如参考TxtViewHolder
:
public class TxtViewHolder<MESSAGE extends IMessage>
extends BaseMessageViewHolder<MESSAGE>
implements MsgListAdapter.DefaultMessageViewHolder {
...
}
- 构造
CustomMsgConfig
, 调用MsgListAdapter.addCustomMsgType
MsgListAdapter adapter = new MsgListAdapter<>("0", holdersConfig, imageLoader);
// 第一个参数为 ViewType,不能设置为 0-12 的整形
// 第二个参数为 resource id
// 第三个参数为是否为发送方
// 第四个为自定义 ViewHolder 的 Class 对象
CustomMsgConfig config1 = new CustomMsgConfig(13, R.layout.item.send_custom, true, DefaultCustomViewHolder.class);
// 第一个参数为 ViewType,同上
adapter.addCustomMsgType(13, config1);
- 在你的
Message
实体中(实现了IMessage
的类),需要设置对应的自定义消息的类型的 type 值。例如:
public class MyMessage implements IMessage {
private int type;
// 本例中 viewType 为 13
public void setType(int viewType) {
this.type = viewType;
}
@Override
public int getType() {
return this.type;
}
}