Как подтолкнуть recylerView вверх при появлении клавиатуры?

Я хочу построить макет сообщения, как в WhatsApp. У меня есть edittext и recylerView.

проблема в том, что при появлении клавиатуры скрываются сообщения!

Итак, давайте скажем это RecylerView:

---item 1---  
---item 2---  
---item 3---  
---item 4---  
---EditText---

когда появляется клавиатура, я получаю это:

---item 1---  
---item 2---  
---EditText---
---Keyboard---  

но я хочу получить это:

---item 3---  
---item 4---  
---EditText---
---Keyboard---

ПРИМЕЧАНИЕ: когда я установил linearLayoutManager.setStackFromEnd(true); это работает, но когда есть одно сообщение, оно появляется внизу страницы.

4 ответа

Установите AdjustSize для действия с RecyclelerView и EditText:

android:windowSoftInputMode="adjustResize"

добавьте onLayoutChangeListener в свой RecyclerView и установите для scrollToPosition значение data.size() -1 в onLayoutChange:

  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() в соответствии с размером держателя элемента и установить AdjustResize в androidManifest.

Вот как я проверяю:

if (recycleView.getChildCount() == items.size()){
    mLayoutManager.setStackFromEnd(true);
}
else{
    mLayoutManager.setStackFromEnd(false);
}

Я не очень хорош в английском. Используйте ChatRecyclerView и установите для 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);
        }
    }
}

Благодаря devdoot Ghosh в Kotlin (я проверяю, не превышает ли размер адаптера 0):

recycler_view.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
    adapter?.itemCount?.takeIf { it > 0 }?.let {
        scrollToPosition(it - 1)
    }
}

В AndroidManifest добавить к активности:

<activity
    ...
    android:windowSoftInputMode="adjustResize"
    />

Обратите внимание, что RecyclerView перейдет к последнему элементу.

Я получил решение от Push Up Content при нажатии на редактировать текст

Просто поместите ниже код в

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Другие вопросы по тегам