环信IM SDK使用(四):环信会话列表实现及相关接口介绍

前言:本文是在已经集成环信SDK及使用环信easeUi的基础上进行的,如果不了解环信SDK集成及easeUi,请点击跳转:环信IM SDK使用(一):集成环信SDK及注意事项环信IM SDK使用(三):环信EaseUi库介绍

从这篇文章开始,笔者会一步步集成环信IM SDK,并介绍集成中用到的主要接口。

一、集成会话列表模块

1、继承EaseConversationListFragment
public class ConversationListFragment extends EaseConversationListFragment {
	......
}

EaseConversationListFragment实现了会话列表逻辑,会话列表按照时间降序排序。同时实现了快捷菜单,实现了消息指定及删除消息的功能。

2、重写EaseConversationListFragment中的onItemClick方法,实现会话列表点击事件
public class ConversationListFragment extends EaseConversationListFragment {

    @Override
    public void onItemClick(View view, int position) {
        super.onItemClick(view, position);
        Toast.makeText(mContext, "点击了条目:"+position, Toast.LENGTH_SHORT).show();
    }
}
3、其他功能

(1)添加其他菜单项
重写onChildCreateContextMenu可添加新的菜单项。
例如:

	@Override
    public void onChildCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo, Object item) {
        super.onChildCreateContextMenu(menu, v, menuInfo, item);
        if(item instanceof MsgTypeManageEntity) {
            String ext = ((MsgTypeManageEntity) item).getExtField();
            if(!TextUtils.isEmpty(ext) && EaseCommonUtils.isTimestamp(ext)) {
                // 含有时间戳
                menu.findItem(R.id.action_cancel_top).setVisible(true);
                menu.findItem(R.id.action_make_top).setVisible(false);
            }
        }
    }

(2)设置菜单项点击事件
重写onChildContextItemSelected可设置菜单项的点击事件。
例如:

	@Override
    public void onChildContextItemSelected(MenuItem menuItem, Object object) {
        super.onChildContextItemSelected(menuItem, object);
        if(object instanceof MsgTypeManageEntity) {
            MsgTypeManageEntity msg = (MsgTypeManageEntity) object;
            switch (menuItem.getItemId()) {
                case R.id.action_make_top :
                    msg.setExtField(System.currentTimeMillis()+"");
                    DemoHelper.getInstance().update(msg);
                    mViewModel.loadConversationList();
                    break;
                case R.id.action_cancel_top:
                    msg.setExtField("");
                    DemoHelper.getInstance().update(msg);
                    mViewModel.loadConversationList();
                    break;
                case R.id.action_delete:
                    mViewModel.deleteSystemMsg(msg);
                    break;
            }
        }
    }

(3)添加其他类型的条目类型,比如说系统消息
重写addDelegate方法,通过listAdapter可添加其他条目类型。
例如:

    @Override
    public void addDelegate() {
        super.addDelegate();
        listAdapter.addDelegate(new SystemMessageDelegate());
    }

二、主要SDK api介绍

1、获取当前用户的所有会话
Map<String, EMConversation> conversations = EMClient.getInstance().chatManager().getAllConversations();

这是从本地数据库获取的。

2、删除会话
boolean isDelete = EMClient.getInstance().chatManager().deleteConversation(conversationId, true);

删除指定id的会话,第二个参数是指是否删除本地的聊天记录。这个方法返回的布尔值,如果删除成功则返回true,否则返回false。

3、将会话中的所有未读消息置为已读
conversation.markAllMessagesAsRead();

三、如何自定义条目类型

在第一中我们说了如何增加条目类型,比如说添加系统消息类型,那么如何增加这种消息类型呢?

1、继承EaseBaseDelegate
public class SystemMessageDelegate extends EaseBaseDelegate<String, SystemMessageDelegate.ViewHolder> {
    @Override
    protected int getLayoutId() {
        return 0;
    }

    @Override
    protected SystemMessageDelegate.ViewHolder createViewHolder(View view) {
        return new ViewHolder(view);
    }

    public static class ViewHolder extends EaseBaseRecyclerViewAdapter.ViewHolder<String> {
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
        }

        @Override
        public void initView(View itemView) {

        }

        @Override
        public void setData(String item, int position) {

        }
    }
}

其中EaseBaseDelegate后面的第一个泛型值对应的是该代理类出来的数据类型,第二个为其ViewHolder。

2、返回条目布局,并将ViewHolder返回给createViewHolder方法。
3、重写isForViewType方法,确定使用该代理类的条件。
    @Override
    public boolean isForViewType(String item, int position) {
        return item != null;
    }
4、最后将该代理类添加到listAdapter中即可
listAdapter.addDelegate(new SystemMessageDelegate());

代理类的具体使用原理,后续文章会进行详细的讲解。大家也可以阅读这篇文章:一种优雅的方式实现RecyclerView条目多类型

附:
(1)Demo地址:EaseIMDemo
(2)环信IM App开源地址:EaseIM
(3)一种优雅的方式实现RecyclerView条目多类型

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值