Desplazamiento ListView - uno por uno

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.

preguntado el 22 de mayo de 12 a las 19:05

2 Respuestas

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

comprobar esta https://www.youtube.com/watch?v=xB-eutXNUMXJtA&feature=youtu.be para un efecto de desplazamiento suave - Hassan Guilak

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 or haz tu propia pregunta.