Utilizzando un paio di idee dalla soluzione di @ nininho, ho ottenuto il mio listview per eseguire lo snap all'elemento con un semplice scr invece di andarci bruscamente. Un avvertimento è che ho testato questa soluzione solo su un Moto X in un ListView di base con testo, ma funziona molto bene sul dispositivo. Tuttavia, sono fiducioso su questa soluzione e ti incoraggio a fornire feedback.
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
}
});
Il motivo per cui rimandare l'scorrimento continuo è perché nel mio test, chiamando direttamente il metodo smoothScrollBy nello stato cambiato richiamata aveva problemi in realtà lo scorrimento. Inoltre, non prevedo una soluzione robusta e pienamente testata che tenga molto lo stato, e nella mia soluzione di seguito, non reggo affatto. Questa soluzione non è ancora disponibile nel Google Play Store, ma dovrebbe fungere da buon punto di partenza.
Se si desidera che sia fluido, provare a utilizzare (vista (Visualizzazione elenco)).smoothScrollToPosition (pos); – stealthcopter
Due problemi: 1) smoothScrollToPosition farà in modo che la logica sopra descritta rilevi un'altra pergamena e vada in un loop nervoso: puoi evitarlo rimuovendo la custodia per SCROLL_STATE_FLING ma non sono sicuro che sia una buona soluzione. 2) smoothScrollToPosition non allinea le cose correttamente, almeno con le mie liste. Fa scorrere la parte superiore dell'elemento specificato fino a 15 pixel sopra la cima della listview, invece di allineare le cose correttamente come setSelection/setSelectionFromTop do. – benkc
Qualsiasi soluzione liscia? – benkol