IMKit 4.X 如何自定义会话列表 Item?

本文仅适用于 IMKit SDK 4.X 版本。

这里以 Private 类型的会话为例:

1.在原有布局基础上改变控件位置

Private 类型的会话列表显示对应的类为 PrivateConversationProvider,对应的布局文件为 rc_item_base_conversation.xml,可以在 IMKit Module 下找到,如果想修改 Private 会话列表 Item 样式,可直接修改该布局文件。另可参考:https://doc.rongcloud.cn/im/Android/4.X/ui/guide/list/custom/android

2.在原有布局基础上添加自定义布局

  • 新建资源文件 item_private_conversation_provider_custom.xml,复制 rc_item_base_conversation.xml 文件中的布局代码至新建文件中,然后添加自己的布局(注意不要删除原有布局),比如增加了一个 id 为 custom 的自定义布局。

  • 新建一个类继承 PrivateConversationProvider

    @ConversationProviderTag(conversationType = "private", portraitPosition = 2)
    public class CustomPrivateConversationProvider extends PrivateConversationProvider {
    
      @Override
      public View newView(Context context, ViewGroup viewGroup) {
          // 此处更换为自定义布局文件
          View result = LayoutInflater.from(context).inflate(R.layout.item_private_conversation_provider, (ViewGroup)null);
          // 使用自定义 ViewHolder
          ViewHolder holder = new ViewHolder();
          // ===> 此部分内容直接复制即可
          holder.title = (TextView)result.findViewById(io.rong.imkit.R.id.rc_conversation_title);
          holder.time = (TextView)result.findViewById(io.rong.imkit.R.id.rc_conversation_time);
          holder.content = (TextView)result.findViewById(io.rong.imkit.R.id.rc_conversation_content);
          holder.notificationBlockImage = (ImageView)result.findViewById(io.rong.imkit.R.id.rc_conversation_msg_block);
          holder.readStatus = (ImageView)result.findViewById(io.rong.imkit.R.id.rc_conversation_status);
          // <===|
          // 获取自定义 View
          holder.customView = result.findViewById(R.id.custom);
          result.setTag(holder);
          return result;
      }
    
      @Override
      public void bindView(View view, int position, UIConversation data) {
          super.bindView(view, position, data);
      }
    
      @Override
      public Spannable getSummary(UIConversation data) {
          return super.getSummary(data);
      }
    
      @Override
      public String getTitle(String userId) {
          return super.getTitle(userId);
      }
    
      @Override
      public Uri getPortraitUri(String userId) {
          return super.getPortraitUri(userId);
      }
      // 自定义 ViewHolder,可添加自定义布局控件
      class ViewHolder extends PrivateConversationProvider.ViewHolder {
          View customView;
      }
    }
    
  • 在 Application 的 onCreate 方法中注册

    RongIM.getInstance().registerConversationTemplate(new CustomPrivateConversationProvider());
    
  • 如果想在点击会话列表中此类型会话 Item 时执行一些操作(自定义布局可以通过 View.findViewById() 来获取)可以设置监听事件:

    RongIM.setConversationListBehaviorListener(new RongIM.ConversationListBehaviorListener() {
    
      @Override
      public boolean onConversationPortraitClick(Context context, Conversation.ConversationType conversationType, String s) {
          return false;
      }
    
      @Override
      public boolean onConversationPortraitLongClick(Context context, Conversation.ConversationType conversationType, String s) {
          return false;
      }
    
      @Override
      public boolean onConversationLongClick(Context context, View view, UIConversation uiConversation) {
          return false;
      }
    
      @Override
      public boolean onConversationClick(Context context, View view, UIConversation uiConversation) {
          return false;
      }
    });
    

IMKit SDK 5.x 可直接参考开发者文档:https://doc.rongcloud.cn/im/Android/5.X/ui/conversationlist/custom-style