Whatsappのようにメッセージレイアウトを作成したいと思います。 edittextとrecyclerViewがあります。
問題は、キーボードが表示されたときにメッセージが非表示になることです。
それで、これをRecyclerViewとしましょう:
_---item 1---
---item 2---
---item 3---
---item 4---
---EditText---
_
キーボードが表示されると、次のようになります。
_---item 1---
---item 2---
---EditText---
---Keyboard---
_
しかし、私はこれを取得したい:
_---item 3---
---item 4---
---EditText---
---Keyboard---
_
注:linearLayoutManager.setStackFromEnd(true);
を設定すると機能しますが、メッセージが1つある場合は、ページの下部に表示されます。
recyclerviewとeditTextを使用してアクティビティのadjustresizeを設定します。
Android:windowSoftInputMode="adjustResize"
onLayoutChangeListenerをRecyclerViewに追加し、onLayoutChangeでscrollToPositionをdata.size()-1に設定します。
mRecyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right,int bottom, int oldLeft, int oldTop,int oldRight, int oldBottom)
{
mRecyclerView.scrollToPosition(mMessages.size()-1);
}
});
私がやった方法は、アイテムホルダーのサイズに応じてsetStackFromEnd()を設定し、androidManifestでadjustResizeを設定することです。
これが私がチェックする方法です:
if (recycleView.getChildCount() == items.size()){
mLayoutManager.setStackFromEnd(true);
}
else{
mLayoutManager.setStackFromEnd(false);
}
私は英語が得意ではありません。 ChatRecyclerViewを使用して、linearlayoutmanagerのstackfromendをfalseに設定します。
public class ChatRecyclerView extends RecyclerView {
private int oldHeight;
public ChatRecyclerView(Context context) {
super(context);
}
public ChatRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ChatRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
int delta = b - t - this.oldHeight;
this.oldHeight = b - t;
if (delta < 0) {
this.scrollBy(0, -delta);
}
}
}
私は 編集テキストをクリックするとコンテンツをプッシュする から解決策を得ました
以下のコードを入力するだけです
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);