2012-05-22 27 views
3

我有一个ListView,必须一次显示4个项目。我必须一个一个滚动一个项目。ListView滚动 - 一个接一个

用户滚动ListView后,我必须重新调整滚动以适合4个项目。我的意思是,我不能展示一个项目的一半。

另一个问题,有没有什么办法可以得到当前ListView的scrollY偏移?因为listView.getScrollY()方法来自View,但不是ListView中的Scroller对象。

回答

0

您可以在ScrollView上实现传感器“OnTouchListener”。 然后技术是不滚动,直到人没有至少一个项目的高度sc ler。代码 例如:然后

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,以便您获得精确的位置值。 –

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

相关问题