RecyclerView 作为聊天界面,被键盘遮挡的解决办法
最近项目在重构,使用 RecyclerView
替换了 ListView
作为 IM
的聊天界面。然后遇到了一个问题就是当键盘弹出来的时候,键盘会遮挡住 RecyclerView
的一部分,造成聊天内容被遮挡,这样肯定是不好的了。然后 Google
, bing
, Stackoverflow
目前搜索到了 3 种方法,但是好像无效。
方法 1
- 给
RecyclerView
的layoutManager
设置setStackFromEnd()
为true
- 该方法可以解决弹出的键盘遮挡
RecyclerView
的情况,但是会出现新的情况,就是当聊天界面为空白的时候,出现的聊天内容会从底部开始加载,如下图:
- 该方法不可用
方法 2
- 在
AndroidManifest.xml
的Activity
添加android:windowSoftInputMode="stateAlwaysHidden|adjustResize"
- 该方法适合
ListView
,不适合RecyclerView
方法 3
-
给
RecyclerView
添加addOnLayoutChangeListener(OnLayoutChangeListener listener)
,根据bottom
和oldbottom
值的变化,滑动到指定位置来实现。 -
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); } } }); } } });
-
该方法解决了问题。
直面挑战,躬身入局