最近项目在重构,使用 RecyclerView
替换了 ListView
作为 IM
的聊天界面。然后遇到了一个问题就是当键盘弹出来的时候,键盘会遮挡住 RecyclerView
的一部分,造成聊天内容被遮挡,这样肯定是不好的了。然后 Google
, bing
, *
目前搜索到了 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);
}
}
});
}
}
}); 该方法解决了问题。