Es posible lograr esto con setSelectionFromTop()
y anulando onSizeChanged()
en una vista de lista personalizada. En su diseño, debe tener un RelativeLayout
con un contenedor principal y colocar la vista de lista sobre el texto de edición.
Al crear su propia vista de lista y reemplazar onSizeChange()
, podrá obtener la posición del último elemento visible antes del cambio de tamaño de la vista de lista y obtener su nueva altura, para finalmente establecer la posición "anterior" de la lista con un desplazamiento de su altura
Cómo funciona: Su lista colocará el último elemento visible anterior en su parte superior y agregará los píxeles para desplazarlo en su parte inferior, justo encima de su texto de edición.
reemplazar el método y mostrarlo con un desplazamiento, haga lo siguiente:
@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
es un poco de solución, porque no he encontrado cómo conseguir la altura del último artículo antes de que onSizeChanged se llama .Entonces, en el caso de que su vista de lista contenga muchos tipos de elementos (sin la misma altura), prefiero obtener la altura seleccionada cuando ocurre un evento, justo antes de que se abra el Teclado.
Así que en la vista de lista personalizada, tiene esta variable global:
int lastItemHeight = 0;
Y en la actividad (o un fragmento, lo que sea), se actualiza este valor en 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();
}
}
});
}
});
Nota: there is another possible solution pero debe establecer android:stackFromBottom="true"
en la vista de lista, que apila su contenido desde la parte inferior. En cambio, esta solución aquí puede mostrar un elemento específico sin forzar que el contenido comience desde la parte inferior, con el comportamiento predeterminado de la vista de lista.
Segunda nota: (por si acaso) no olvide agregar android:windowSoftInputMode="adjustResize"
en el manifiesto.
Trate http://stackoverflow.com/questions/16133706/push-listview-when-keyboard-appears-without-adjustpan http://stackoverflow.com/questions/9351509/keeping-the -last-visible-item-of-a-listview-when-the-size-of-the-listview-change – MSaudi