Desplazamiento ListView - uno por uno
Frecuentes
Visto 3,336 veces
3
Tengo un ListView que debe mostrar 4 elementos a la vez. Y debo desplazar un elemento, uno por uno.
Después de que el usuario desplace el ListView, debo reajustar el desplazamiento para que se ajuste a 4 elementos. Quiero decir, no puedo mostrar un artículo a la mitad.
Otra pregunta, ¿hay alguna forma de obtener el desplazamiento actual de ListView scrollY? Porque el método listView.getScrollY() es de View, pero no del objeto Scroller dentro de ListView.
2 Respuestas
3
He encontrado una excelente solución. Funciona perfecto para mí. Puede ser que mi respuesta ayude a alguien.
class ScrollListener implements AbsListView.OnScrollListener{
boolean aligned;
@Override
public void onScrollStateChanged(AbsListView absListView, int state) {
if (state == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
aligned = false;
}
if (state == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
if (!aligned) {
if (Math.abs(absListView.getChildAt(0).getY()) < Math.abs(absListView.getChildAt(1).getY())) {
listView.smoothScrollToPosition(absListView.getFirstVisiblePosition());
} else {
listView.smoothScrollToPosition(absListView.getLastVisiblePosition());
}
}
aligned = true;
}
}
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
}
Debo decir que en mi situacion tenia dos elementos visibles asi que si tienes 4 deberias jugar con indices ("getChildAt(0)" and "getChildAt(1)")
. ¡Buena suerte!
Respondido 25 Jul 13, 06:07
0
puede implementar el sensor "OnTouchListener" en ScrollView. entonces la técnica es no desplazarse hasta que la persona no haya deslizado al menos la altura de un elemento. ejemplo del código:
scroll.setOnTouchListener(new OnTouchListener()
{
private int mLastY;
public boolean onTouch(View v, MotionEvent event)
{
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN: //the user places his finger on the screen
mLastY=(int)event.getY(); //to get the "y" position starting
break;
case MotionEvent.ACTION_MOVE:
if(mLastY-event.getY() >= theSizeOfItem) //if a movement of the size of an item occurs
{
scroll.scrollTo(0, scroll.getScrollY()+ theSizeOfItem));
scroll.invalidate();
mLastY=(int)event.getY(); //reset the starting position to the current position
}
if(event.getY()-mLastY >= theSizeOfItem) //if a movement of the size of an item occurs
{
scroll.scrollTo(0, scroll.getScrollY() - theSizeOfItem));
scroll.invalidate();
mLastY=(int)event.getY(); //reset the starting position to the current position
}
break;
default:
break;
}
return v.onTouchEvent (event); //to use other sensors (OnClick, OnLongClick, ...)
}});
¡Entonces debe implementar el caso donde el pergamino llega al final! Lo siento por mi inglés, espero que te ayude.
contestado el 23 de mayo de 12 a las 13:05
Sí, funciona de esta manera, gracias. Pero ScrollView no usa adaptadores. En mi escenario, tengo que usar adaptadores con ListView, porque necesito un ciclo infinito, y es más fácil de hacer usando adaptadores. El problema con ListView es que no puede obtener su compensación real de desplazamiento. - rlecheta
si entiendo tu problema. la solución sería usar un GridView con un adaptador, para que obtengas valores precisos de la posición. - julien dumortier
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas android android-widget android-listview or haz tu propia pregunta.
comprobar esta https://www.youtube.com/watch?v=xB-eutXNUMXJtA&feature=youtu.be para un efecto de desplazamiento suave - Hassan Guilak