保利威文档中心

幫助中心

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,介面定義了可供外部直接呼叫的功能方法,以及需要外部回應的事件監聽器。

  1. 提供給外部的可直接呼叫功能方法
/**
 * 初始化
 *
 * @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();
  1. 需要外部回應的事件監聽器
/**
 * 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層實作

联系客服,在线咨询