onScrollStateChanged 和 onScroll

                       

转载请标明出处:http://blog.csdn.net/xx326664162/article/details/49617013    文章出自:薛瑄的博客

你也可以查看我的其他同类文章,也会让你有一定的收货

ListView的 滚动事件监听

实现滚动监听,首先需要通过实现OnScrollListener 接口,
重写一下两个方法:

  • onScrollStateChanged    用于监听ListView滑动状态的变化

  • onScroll  用于监听ListView屏幕滚动

onScrollStateChanged

// 监听滑动状态的变化@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {    // OnScrollListener.SCROLL_STATE_FLING; //屏幕处于甩动状态    // OnScrollListener.SCROLL_STATE_IDLE; //停止滑动状态    // OnScrollListener.SCROLL_STATE_TOUCH_SCROLL;// 手指接触状态    // 记录当前滑动状态}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

scrollState 回调顺序如下:

  • scrollState = SCROLL_STATE_TOUCH_SCROLL(1):表示正在滚动。当屏幕滚动且用户使用的触碰或手指还在屏幕上时为1
  • scrollState =SCROLL_STATE_FLING(2) :表示手指做了抛的动作(手指离开屏幕前,用力滑了一下,屏幕产生惯性滑动)。
  • crollState =SCROLL_STATE_IDLE(0) :表示屏幕已停止。屏幕停止滚动时为0。

onScroll

监听屏幕滑动,并记录当前页面item显示情况

// 监听屏幕滚动的item的数量@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,        int visibleItemCount, int totalItemCount) {
  
  
  • 1
  • 2
  • 3
  • 4

onScroll中参数讲解:

1、 firstVisibleItem:当前窗口中能看见的第一个列表项ID(从0开始)关于这个参数的详细理解可参考这里
 2、 visibleItemCount:当前窗口中能看见的列表项的个数(小半个也算)
 3、 totalItemCount:列表项的总数

在ExpandableListView中,组类和子类都会被计算为Item,

  • 图中红色代表手机
  • 图中黑色代表ExpandableListView
  • 1 和2 代表组项目,2.1  2.2代表展开的子项
    这里写图片描述

  • firstVisibleItem 指的是2.1,此时的2.1在列表项的索引是2,组项目1的索引为0,组项目2的索引为1

  • visibleItemCount 为5

  • totalItemCount 为8

参考:http://blog.csdn.net/lang791534167/article/details/45287053

 

关注我的公众号,轻松了解和学习更多技术
  这里写图片描述

           
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android 中,我们经常使用 ListView 来展示一些数据。当我们滑动 ListView 时,如果需要记录当前滚动的位置,并在下次打开时恢复到上次滚动的位置,该怎么做呢?下面是一种完美的实现方法。 首先,在 Activity 中定义一个变量来记录当前滚动的位置: ```java private int mLastFirstVisibleItem = 0; ``` 然后,在 ListView 的监听器中获取当前的滚动位置: ```java listView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (view.getId() == listView.getId()) { final int currentFirstVisibleItem = listView.getFirstVisiblePosition(); if (currentFirstVisibleItem > mLastFirstVisibleItem) { // 向上滚动 } else if (currentFirstVisibleItem < mLastFirstVisibleItem) { // 向下滚动 } mLastFirstVisibleItem = currentFirstVisibleItem; } } }); ``` 接下来,在 Activity 的 onResume() 方法中获取上次滚动的位置并恢复: ```java @Override protected void onResume() { super.onResume(); // 恢复滚动位置 if (mLastFirstVisibleItem != 0) { listView.setSelectionFromTop(mLastFirstVisibleItem, 0); } } ``` 最后,在 Activity 的 onPause() 方法中保存当前滚动的位置: ```java @Override protected void onPause() { super.onPause(); // 保存滚动位置 mLastFirstVisibleItem = listView.getFirstVisiblePosition(); } ``` 至此,ListView 滚动位置的记录和恢复就完成了。这种方法适用于一般的 ListView,如果你使用了自定义的 Adapter 或者 ViewHolder,需要根据实际情况做出相应的修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值