Utilizando un par de ideas de la solución de @ nininho, obtuve mi lista para ajustar al elemento con un scr suave oll en lugar de ir abruptamente a ella. Una advertencia es que solo probé esta solución en un Moto X en un ListView básico con texto, pero funciona muy bien en el dispositivo. Sin embargo, confío en esta solución y lo animo a que envíe sus comentarios.
listview.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
if (scrollState == SCROLL_STATE_IDLE) {
View itemView = view.getChildAt(0);
int top = Math.abs(itemView.getTop());
int bottom = Math.abs(itemView.getBottom());
int scrollBy = top >= bottom ? bottom : -top;
if (scrollBy == 0) {
return;
}
smoothScrollDeferred(scrollBy, (ListView)view);
}
}
private void smoothScrollDeferred(final int scrollByF,
final ListView viewF) {
final Handler h = new Handler();
h.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
viewF.smoothScrollBy(scrollByF, 200);
}
});
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
});
La razón por la que diferir el desplazamiento suave se debe a que en mis pruebas, llamar directamente al método smoothScrollBy en el estado cambia de devolución de llamada había problemas en realidad el desplazamiento. Además, no preveo que una solución robusta y completamente probada tenga mucho estado, y en mi solución a continuación, no tengo ningún estado. Esta solución aún no está en Google Play Store, pero debería servir como un buen punto de partida.
Si quiere que sea suave intente usar (vista (ListView)).smoothScrollToPosition (pos); – stealthcopter
Dos problemas para hacer eso: 1) smoothScrollToPosition hará que la lógica anterior detecte otro desplazamiento y entre en un bucle nervioso. Puede evitar esto quitando el estuche para SCROLL_STATE_FLING, pero no estoy seguro de si es una buena solución. 2) smoothScrollToPosition no alinea las cosas correctamente, al menos con mis listas. Desplaza la parte superior del elemento especificado a tal vez 15 píxeles por encima de la vista de lista, en lugar de alinear las cosas correctamente como setSelection/setSelectionFromTop do. – benkc
¿Alguna solución suave? – benkol