6_6-互动学堂场景-聊天室
更新時間:2023-04-17 15:27:57
1 功能概述
聊天室模組包含發言、回覆、歷史記錄等功能。聊天室模組在 UI、互動、功能上,相較於其他模組,會更複雜且更龐大。因此設計、建置、維護一個聊天室,也是一件較為費時費力的事情。我們建議直接使用保利威封裝好的聊天室模組,該部分程式碼完全開源,支援直接使用以及二次開發。
2 使用演示
互動學堂中聊天室是一個彈層佈局,呼叫聊天室佈局的建構函式、設定回呼監聽,並呼叫其初始化方法以完成初始化。在需要開啟聊天室時,呼叫其show()方法顯示即可。
// 聊天室布局构造、设置回调监听
private void initChatroomLayout() {
chatroomLayout = new PLVHCChatroomLayout(getContext());
chatroomLayout.setOnViewActionListener(new IPLVHCChatroomLayout.OnViewActionListener() {
// 聊天室布局的回调监听 ...
});
}
// 初始化数据
chatroomLayout.init(liveRoomDataManager);
// 需要显示的时候,调用show
chatroomLayout.show(getWidth(), smallScreenHeight, smallScreenLocation);
詳細的呼叫程式碼以及與其他模組的通訊,請參考PLVHCToolBarLayout類別中的程式碼呼叫。
3 接口介紹
互動學堂聊天室佈局的介面定義為IPLVHCChatroomLayout,介面定義了可供外部直接呼叫的功能方法,以及需要外部回應的事件監聽器。
- 提供給外部的可直接呼叫功能方法
/**
* 初始化
*
* @param liveRoomDataManager 直播间数据管理器
*/
void init(IPLVLiveRoomDataManager liveRoomDataManager);
/**
* 设置view交互事件监听器
*
* @param listener 监听器
*/
void setOnViewActionListener(OnViewActionListener listener);
/**
* 获取聊天室presenter
*
* @return 聊天室presenter
*/
IPLVChatroomContract.IChatroomPresenter getChatroomPresenter();
/**
* 课节准备中
*/
void onLessonPreparing(long serverTime, long lessonStartTime);
/**
* 课节开始
*/
void onLessonStarted();
/**
* 课节结束
*/
void onLessonEnd(long inClassTime);
/**
* 处理图片选择结果
*
* @param data 数据
*/
void handleImgSelectResult(Intent data);
/**
* 显示布局
*/
void show(int viewWidth, int viewHeight, int[] viewLocation);
/**
* 隐藏
*/
void hide();
/**
* 是否显示状态
*
* @return true:显示,false:不显示
*/
boolean isShown();
/**
* 是否拦截返回事件
*
* @return true:拦截,false:不拦截
*/
boolean onBackPressed();
/**
* 销毁,释放资源
*/
void destroy();
- 需要外部回應的事件監聽器
/**
* view交互事件监听器
*/
interface OnViewActionListener {
/**
* 可见性改变回调
*
* @param isVisible true:显示,false:隐藏
*/
void onVisibilityChanged(boolean isVisible);
/**
* 未读信息数改变
*
* @param currentUnreadCount 未读信息数
*/
void onUnreadMsgCountChanged(int currentUnreadCount);
}
4 實作介紹
IPLVHCChatroomLayout的實作類別是PLVHCChatroomLayout,包含聊天訊息列表、傳送資訊輸入框、表情佈局、按讚佈局等子佈局。
4.1 初始化視圖
初始化視圖在聊天室佈局建構時執行,包含聊天室子視圖的建立、回呼監聽設定、訊息列表初始化,以及表情列表初始化等。
private void initView() {
LayoutInflater.from(getContext()).inflate(R.layout.plvhc_chatroom_layout, this);
// findViewById ...
// setOnClickListener ...
plvhcChatroomCallInputEt.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
v.callOnClick();
}
return true;
}
});
plvhcChatroomChatMsgRv.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
closeEmojiSmallLayout();
}
return false;
}
});
// 初始化聊天室列表
PLVMessageRecyclerView.setLayoutManager(plvhcChatroomChatMsgRv).setStackFromEnd(false);
plvhcChatroomChatMsgRv.addItemDecoration(new PLVMessageRecyclerView.SpacesItemDecoration(ConvertUtils.dp2px(12), 0));
chatMessageAdapter = new PLVHCMessageAdapter();
chatMessageAdapter.setOnViewActionListener(new PLVHCMessageAdapter.OnViewActionListener() {
// 聊天消息列表回调监听 ...
});
plvhcChatroomChatMsgRv.setAdapter(chatMessageAdapter);
plvhcChatroomChatMsgRv.addUnreadView(plvhcChatroomMoreMsgTv);
plvhcChatroomChatMsgRv.addOnUnreadCountChangeListener(new PLVMessageRecyclerView.OnUnreadCountChangeListener() {
@Override
public void onChange(int currentUnreadCount) {
plvhcChatroomMoreMsgTv.setText(currentUnreadCount + "条新信息");
}
});
// 初始化下拉加载历史记录控件
plvhcChatroomSwipeLoadView.setColorSchemeResources(android.R.color.holo_blue_light, android.R.color.holo_red_light,
android.R.color.holo_orange_light, android.R.color.holo_green_light);
plvhcChatroomSwipeLoadView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
chatroomPresenter.requestChatHistory(chatroomPresenter.getViewIndex(chatroomView));
}
});
// 初始化表情列表
PLVHCChatroomUtils.initEmojiList(plvhcChatroomEmojiRv, plvhcChatroomCallInputEt);
// 默认不可用状态
disableChatroom();
}
4.2 初始化資料
初始化資料包含資料管理器IPLVLiveRoomDataManager的接收儲存、PresenterIChatroomPresenter的註冊和初始化、歷史聊天資料的請求,以及聊天室 socket 的登入。
@Override
public void init(IPLVLiveRoomDataManager liveRoomDataManager) {
this.liveRoomDataManager = liveRoomDataManager;
String userType = liveRoomDataManager.getConfig().getUser().getViewerType();
isTeacherType = PLVSocketUserConstant.USERTYPE_TEACHER.equals(userType);
plvhcChatroomCloseRoomIv.setVisibility(isTeacherType ? View.VISIBLE : View.GONE);
this.chatroomPresenter = new PLVChatroomPresenter(liveRoomDataManager);
this.chatroomPresenter.registerView(chatroomView);
this.chatroomPresenter.init();
//请求一次历史记录
chatroomPresenter.requestChatHistory(chatroomPresenter.getViewIndex(chatroomView));
initSocketLoginManager();
}
聊天室以 mvp 模式實作,具體互動邏輯在chatroomView內實作,詳情可參考程式碼區塊 聊天室 - MVP模式的view層實作。
