環信提供的 EaseConversationListFragment 封裝了會話列表的核心邏輯,開發者只需繼承並配置監聽器,即可實現消息實時刷新、點擊跳轉聊天頁等功能。本文詳細拆解關鍵代碼與實現原理。
public class ConversationListFragment extends EaseConversationListFragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// 1. 註冊消息監聽
EMClient.getInstance().chatManager().addMessageListener(msgListener);
// 2. 設置條目點擊跳轉
setConversationListItemClickListener(itemClickListener);
// 3. 清空舊數據準備加載
conversationList.clear();
}
}
private EMMessageListener msgListener = new EMMessageListener() {
@Override
public void onMessageReceived(List<EMMessage> messages) {
// 通知通知欄顯示新消息
EaseUI.getInstance().getNotifier().onNewMesg(messages);
// 刷新會話列表 UI
refresh();
}
// 其他回調按需實現...
@Override public void onCmdMessageReceived(List<EMMessage> messages) {}
@Override public void onMessageReadAckReceived(List<EMMessage> messages) {}
@Override public void onMessageDeliveryAckReceived(List<EMMessage> messages) {}
@Override public void onMessageChanged(EMMessage msg, Object change) {}
};
關鍵點:
onMessageReceived 在接收線程回調,需確保 refresh() 切換到主線程(EaseUI 內部已處理)Notifier.onNewMesg() 負責系統通知欄顯示,與列表刷新分離private EaseConversationListItemClickListener itemClickListener =
new EaseConversationListItemClickListener() {
@Override
public void onListItemClicked(EMConversation conversation) {
Intent intent = new Intent(getActivity(), ChatActivity.class);
// 傳遞會話 ID(單聊為用戶 ID,群聊為群組 ID)
intent.putExtra(EaseConstant.EXTRA_USER_ID, conversation.conversationId());
// 判斷會話類型
if (conversation.getType() == EMConversation.EMConversationType.GroupChat) {
intent.putExtra(EaseConstant.EXTRA_CHAT_TYPE, EaseConstant.CHATTYPE_GROUP);
}
startActivity(intent);
}
};
參數說明:
| Extra Key | 值來源 | 說明 |
|---|---|---|
conversation.conversationId() | 單聊為對方環信 ID,群聊為群組 ID | |
CHATTYPE_GROUP / CHATTYPE_SINGLE | 標識會話類型,ChatActivity 据此加載不同布局/邏輯 |
@Override
public void onDestroy() {
super.onDestroy();
EMClient.getInstance().chatManager().removeMessageListener(msgListener);
// 防止內存洩漏與重複回調
}
若需自定義項目佈局(如顯示未讀數、@提醒、置頂標識),可重寫:
@Override
protected View getViewForPosition(int position, View convertView, ViewGroup parent) {
// 復用 ViewHolder 模式,綁定自定義佈局 R.layout.item_conversation_custom
// 綁定 conversation 數據到 View
return convertView;
}
環信 EaseConversationListFragment 遵循「模板方法 + 監聽器」模式,核心只需三步:
EMMessageListener 接收消息變化 → refresh()OnItemClickListener 跳轉 ChatActivity 並傳遞會話標識onDestroy 註銷監聽防洩漏掌握這套流程,即可快速構建穩定、實時的 IM 會話列表頁面。