Как подтолкнуть 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);