最近項目在重構,使用 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); } } }); } } });
-
該方法解決了問題。