Этого можно достичь с помощью setSelectionFromTop()
и переопределением onSizeChanged()
в пользовательском просмотре списка. В вашем макете у вас должен быть RelativeLayout
есть родительский контейнер и поместите представление списка над текстом редактирования.
Создав свой собственный список и переопределив onSizeChange()
, вы сможете получить позицию последнего видимого элемента до изменения размера списка и получить его новую высоту, чтобы окончательно установить «предыдущую» позицию списка с смещение его высоты.
Как это работает: Ваш список поместит предыдущий последний видимый элемент в его верхнюю часть, и вы добавите пиксели, чтобы прокрутить его в нижней части, чуть выше текста редактирования.
Чтобы переопределить метод и отобразить его со смещением, выполните следующие действия:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// get last visible item's position before resizing
int lastPosition = super.getLastVisiblePosition();
// call the super method to resize the listview
super.onSizeChanged(w, h, oldw, oldh);
// after resizing, show the last visible item at the bottom of new listview's height
super.setSelectionFromTop(lastPosition, (h - lastItemHeight));
}
lastItemHeight
- это небольшой обходной путь, потому что я не нашел, как получить высоту последнего элемента до вызова onSizeChanged. Затем, если ваш список содержит много типов элементов (без одинаковой высоты), я предпочитаю получать выбранную высоту, когда происходит событие, непосредственно перед открытием SoftKeyboard.
Итак, в пользовательском просмотре списка есть глобальная переменная:
int lastItemHeight = 0;
И в действии (или фрагменте, что угодно) вы обновляете это значение в OnClickListener
:
edittext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// set a new Thread
listview.post(new Runnable() {
@Override
public void run() {
// get last visible position of items
int lastPosition = listview.getLastVisiblePosition() - 1;
// if the view's last child can be retrieved
if ( listview.getChildAt(lastPosition) != null ) {
// update the height of the last child in custom listview
listview.lastItemHeight = listview.getChildAt(lastPosition).getHeight();
}
}
});
}
});
Примечание: есть и другое возможное решение , но вы должны установить android:stackFromBottom="true"
в просмотре списка, который складывает его содержимое снизу. Вместо этого данное решение может отображать определенный элемент без принудительного запуска контента снизу, с поведением списка по умолчанию.
Второе примечание: (на всякий случай) не забудьте добавить android:windowSoftInputMode="adjustResize"
в манифест.