前言:本文是在已经集成环信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条目多类型。