让ListView自动滚动

 

让ListView自动滚动

分类: android   2047人阅读  评论(1)  收藏  举报

原文转载:http://blog.jpardogo.com/autoscroll-a-listview-with-listviewautoscrollhelper/

  我想要实现一种效果,就是能够让ListView在没有用户交互的时候,可以自动滚动。

  之前有个比较笨拙的方法。说实话,我从来就不喜欢这种方法,手动创建一个计时器或者线程来处理它停止和重新启动。

  每次看到采用这种方法的代码,我都觉得很无奈。所以,我决定,要去找到更加优雅的方式来实现。

  考虑实现的可能性,不自觉的在我脑海中出现AutoScrollHelper类,它是一个工具类,赋予View于自动滚动的功能。

  如果你想要在ListView实现这种功能,那么可以使用AutoScrollHelper的针对ListView的子类 ListViewAutoScrollHelper 

  ListViewAutoScrollHelper类可以实现,当用户滑动或者点击listview之后,启动autoScroll的自动滚动功能。

  ListViewAutoScrollHelper类有三个选项:

 1.EDGE TYPE INSIDE: 

   edge type 类型是在界面的不包括扩展的范围内指定一个活动的区域。

 2.EDGE TYPE INSIDE_EXTEND: 

    edge type 类型是在界面的包括扩展的范围内指定一个活动的区域。

 3.EDGE TYPE OUTSIDE:

    edge type 类型是在界面的包括扩展的范围之外指定一个活动的区域。


 为了实现刚刚所说的功能,我模拟系统的消息传递,将用户操作的action_move参数传递给listView。代码如下:

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. private void startAutoScroll() {  
  2.     getListView().post(new Runnable() {  
  3.         @Override  
  4.         public void run() {  
  5.             forceScroll();  
  6.         }  
  7.     });  
  8. }  
  9.   
  10. private void forceScroll() {  
  11.     MotionEvent event = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis(), MotionEvent.ACTION_MOVE, mListView.getWidth()/2, -1, 0);  
  12.     mScrollHelper.onTouch(mListViewLeft, event);  
  13. }  

上面的方法,可以让ListViewAutoScrollHelper周期性的调用其他的scrollTargetBy函数。接下来,我们就要实现这个scrollTargetBy,并在函数体内,设置需要滚动的偏移量。

代码如下:

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. mScrollHelper = new ListViewAutoScrollHelper (mListView) {  
  2.         @Override  
  3.         public void scrollTargetBy(int deltaX, int deltaY) {  
  4.             mListView.smoothScrollBy(2, 0);  
  5.         }  
  6.     };  

 哈哈,是不是很酷,有了AutoScrollHelper,就可以和你的定时器说再见啦!

 现在接下来,我们更关心的是,怎么样,让用户点击交互之后,listview就可以滚动起来。一起往下研究吧!

  我们要想到,我们接下来要的需求。

 第一: 检测用户的触摸交互,可以用OnTouch函数来实现。

 第二: 知道用户的交互之后,就可以让AutoScrollHelper进行工作了。但是又怎么让AutoScrollHelper停止工作呢。因此可以使用onScrollStateChanged函数来对滚动做监听。


 根据以上问题,编写代码如下:

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2. public boolean onTouch(View v, MotionEvent event) {  
  3. switch (event.getAction()) {  
  4.         case MotionEvent.ACTION_DOWN:  
  5.             mActionDown=true;  
  6.             break;  
  7.         case MotionEvent.ACTION_UP:  
  8.             mActionDown=false;  
  9.             break;  
  10.     }  
  11.     return mScrollHelper.onTouch(v, event);  
  12. }  
  13.   
  14. @Override  
  15. public void onScrollStateChanged(AbsListView view, int scrollState) {  
  16.     switch (scrollState) {  
  17.         case SCROLL_STATE_IDLE:  
  18.             if(!mActionDown){  
  19.                 forceScroll();  
  20.             }  
  21.             break;  
  22.     }  
  23. }  


大体就这样吧,拼拼凑凑,思路就是这样。

题外话:酷狗音乐中的歌词滚动很多人不知道怎么用textview类和scrollto函数。通过这篇文章,是否已经有了更多的思路啦?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值