2012-05-22 6 views
3

У меня есть ListView, который должен отображать 4 элемента за раз. И я должен прокрутить один элемент, один за другим.ListView scroll - один за другим

После того, как пользователь прокручивает ListView, я должен скорректировать свиток, чтобы он соответствовал 4 элементам. Я имею в виду, я не могу показать предмет наполовину.

Другой вопрос, есть ли способ получить текущий сдвиг прокрутки ListView? Поскольку метод listView.getScrollY() находится в представлении, но не в объекте Scroller внутри ListView.

ответ

0

вы можете реализовать датчик «OnTouchListener» в ScrollView. , тогда техника не должна прокручиваться, пока у человека не будет scrooler, по крайней мере, высоты элемента. пример кода:

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, ...) 
    }}); 

должен затем реализовать случай, когда свиток достигает конца! Извините за мой английский, я надеюсь, что это вам поможет

+0

Да, это работает таким образом, спасибо. Но ScrollView не использует адаптеры. В моем сценарии я должен использовать адаптеры с ListView, потому что мне нужен бесконечный цикл, и его проще сделать с помощью адаптеров. Проблема с ListView заключается в том, что вы не можете получить свое реальное смещение scrollY. – rlecheta

+0

если я понимаю вашу проблему. решение будет заключаться в использовании GridView с адаптером, так что вы pourez получите точные значения позиции. –

3

Я нашел отличное решение. Он отлично подходит для меня. Может быть, мой ответ поможет кому-то.

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) { 
     } 
    } 

Я должен сказать, что в моей ситуации у меня было два видимых элементов, так что если у вас есть 4, вы должны играть с индексами ("getChildAt(0)" and "getChildAt(1)"). Удачи!

+0

проверить этот [ответ] (http://stackoverflow.com/a/18133295/2977976) для плавного эффекта прокрутки – HMG

Смежные вопросы