RecyclerView 作为聊天界面,被键盘遮挡的解决办法

时间:2022-10-01 19:35:51

最近项目在重构,使用 RecyclerView 替换了 ListView 作为 IM 的聊天界面。然后遇到了一个问题就是当键盘弹出来的时候,键盘会遮挡住 RecyclerView 的一部分,造成聊天内容被遮挡,这样肯定是不好的了。然后 Google, bing* 目前搜索到了 3 种方法,但是好像无效。

方法 1

  • RecyclerViewlayoutManager 设置 setStackFromEnd()true
  • 该方法可以解决弹出的键盘遮挡 RecyclerView 的情况,但是会出现新的情况,就是当聊天界面为空白的时候,出现的聊天内容会从底部开始加载,如下图:

RecyclerView 作为聊天界面,被键盘遮挡的解决办法

  • 该方法不可用

方法 2

  • AndroidManifest.xmlActivity 添加 android:windowSoftInputMode="stateAlwaysHidden|adjustResize"
  • 该方法适合 ListView ,不适合 RecyclerView

方法 3

  • RecyclerView 添加 addOnLayoutChangeListener(OnLayoutChangeListener listener) ,根据 bottomoldbottom 值的变化,滑动到指定位置来实现。
  • OnLayoutChangeListener 接口,只有一个方法 onLayoutChange() ,在源码中的注释:Called when the layout bounds of a view changes due to layout processing. 意思是布局界限改变时调用
  • 代码:

    mRecyclerView.addOnLayoutChangeListener(new OnLayoutChangeListener() {
    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
    if (bottom < oldBottom) {
    mRecyclerView.post(new Runnable() {
    @Override
    public void run() {
    if (commonChatAdapter.getItemCount() > 0) {
    mRecyclerView.smoothScrollToPosition(commonChatAdapter.getItemCount() - 1);
    }
    }
    });
    }
    }
    });
  • 该方法解决了问题。