如何控制ListView的垂直滚动

时间:2012-06-11 08:12:56

标签: android listview scroll android-listview

我所在的团队正在为平板电脑构建一个应用程序,就像杂志一样 我们正在使用ListView来展示一篇包含多个页面的文章 每个row包含大量数据,用于表示杂志的页面 在纵向模式下,一行几乎占据整个屏幕,因此一行==一个屏幕

截至目前,当用户滚动整个ListView时,它的行为与正常的ListView一样 -

  • 如果你弹得足够快,它会快速滚动
  • 如果您慢慢滚动,只要停止手指的垂直运动,滚动就会停止

我想要什么 -

  • 无论用户滚动/轻弹多快或多慢(使手指在垂直方向上移动),都只应滚动一行。

有没有办法可以控制ListView的滚动方式?

我搜索了很多,很多文章建议如何滚动到顶部或特定位置,但没有人真正告诉滚动是如何发生的,以便我可以控制它。
我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

那么你的问题仅限于ListView,我认为可以通过计算屏幕尺寸来实现,从而对行为采取行动,但因为我不确定ListView技术性。如果我实施的话,我可以指导你,我会使用:

1)ViewPager:我认为哪种更适合您当前的要求,您可以在此处找到详细信息 - http://android-developers.blogspot.in/2011/08/horizontal-view-swiping-with-viewpager.html

获取本页提及的更多自定义要求的帮助 - How to make an Android view that flips between views on swipe/fling

2)充气和使用动画:我可以使用的另一件事是在运行时对页面进行充气并对特定手势做出反应,并在动画时整合动画。

但如果使用ListViews并非强制要求,那么ViewPager的使用将优于ListViews,AFAIT。

答案 1 :(得分:-1)

ListView使用具有私有访问权限的Scroller(OverScroller over GingerBread 2.3)。不确定这是否会帮助你,但它可以指出你正确的方向。要获得您想要的行为,您可以尝试以下操作(我只在ScrollView上测试过这个):

//Replace the scroller with your own

Field mScroller;
    try {
        mScroller = ListView.class.getDeclaredField("mScroller");
        mScroller.setAccessible(true); 

        scroll = new OverScroller(mContext, new DecelerateInterpolator(DECELERATE_AMOUNT));
        mScroller.set(yourListView, scroll);

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 

然后将ontouchlistener添加到您的ListView并向上滚动:

mScroller.startScroll(0, startY, 0, distanceToNextPage, 500);

上述解决方案的替代方案可以尝试以下方法:

  1. 将ontouchListener添加到ListView
  2. 点亮:

    yourListView.smoothScrollToPosition(LIST_ITEM_INDEX);