ListView中的setOnScrollListener
ListView是Android中最常用的控件之一,随着时代发展,RecyclerView有取代它的趋势,但是在一些老代码中,ListView依然扮演着重要的作用。
项目中遇到一个需求,需要监听ListView在滑动时滑动的Y轴坐标。这个需求在RecyclerView中computeVerticalScrollOffset方法完成了这项功能。只需要在OnScrollListener的onScrolled方法中,调用computeVerticalScrollOffset即可在滑动时获得Y坐标。
然而,在ListView中,这个实现却没有这么方便。
在ListView中,setOnScrollListener(new AbsListView.OnScrollListener(),可以获得以下两个方法:
1)public void onScrollStateChanged(AbsListView view, int scrollState)
2)public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
方法1 监听着ListView的滑动状态改变。官方的有三种状态SCROLL_STATE_TOUCH_SCROLL、SCROLL_STATE_FLING、SCROLL_STATE_IDLE:
SCROLL_STATE_TOUCH_SCROLL:手指正拖着ListView滑动
SCROLL_STATE_FLING:ListView正自由滑动
SCROLL_STATE_IDLE:ListView滑动后静止
方法2 监听滑动:
firstVisibleItem:第一个可见项是ListView的第几项
visibleItemCount:可见项的总数
totalItemCount:总项数
可见,在ListView中,我们是没有获得滑动Y坐标的方法的。但是我们有firstVisibleItem,由它可以知道我们已经滑走了多少个item,然后逐一测出它们的高度就可以得知总共滑走的Y值是多少了。

Dictionary<Integer, Integer> listViewItemHeights = new Hashtable<Integer, Integer>();
contentListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
View c = view.getChildAt(0); //this is the first visible row
if (c != null) {
int scrollY = -c.getTop();
listViewItemHeights.put(view.getFirstVisiblePosition(), c.getHeight());
for (int i = 0; i < view.getFirstVisiblePosition(); ++i) {
if (listViewItemHeights.get(i) != null) // (this is a sanity check)
scrollY += listViewItemHeights.get(i); //add all heights of the views that are gone
}
Log.d("tag", "the scrollY of the listview is==========" + scrollY);
}
}
});
ListView中的setOnScrollListener的更多相关文章
- 安卓中listview中性能优化的处理
1.在adapter中的getView方法中尽量少使用逻辑 不要在你的getView()中写过多的逻辑代码,我们能够将这些代码放在别的地方.比如: 优化前的getView(): @Override p ...
- ListView中的数据表格写入Excel中
SaveFileDialog sfd = new SaveFileDialog(); sfd.DefaultExt = "xls"; sfd.Filter = "Exce ...
- ListView中动态显示和隐藏Header&Footer
ListView的模板写法 ListView模板写法的完整代码: android代码优化----ListView中自定义adapter的封装(ListView的模板写法) 以后每写一个ListView ...
- Android 如何在 ListView 中更新 ProgressBar 进度
=======================ListView原理============================== Android 的 ListView 的原理打个简单的比喻就是: 演员演 ...
- Xamarin.Forms listview中的button按钮,实现带着参数返回上一级页面
今天在做列表显示的时候遇到一个问题,就是在ListView中如何才能让一个button的按钮工作并且包含参数呢? 其实有点类似于rep里的控件无法起获取一样.在Xamarin中,当你button绑定事 ...
- ListView 中含有 EditText 导致焦点丢失的问题
ListView 中的 item 中有 EditText 时. 如果activity的输入法选项设置为 android:windowSoftInputMode="adjustResize&q ...
- ListView 中的ImageView Button
1.ListView 中的ImageView Button的点击事件会屏蔽掉ItemView的点击事件 原因是ImageView Button在回执过程中会抢夺item的焦点 解决办法:在xml中添 ...
- C#中清空ListView中的数据
我的显示数据的方式通过button按钮点击事件,当点击之后查询数据库库并将数据显示出来. 代码如下: private void button6_Click(object sender, EventAr ...
- Android,LIstView中的OnItemClick点击无效的解决办法
在List_Item布局文件中的根节点加上如下背景标黄的这一行 <?xml version="1.0" encoding="utf-8"?> < ...
随机推荐
- Could not find or load main class org.gradle.wrapper.GradleWrapperMain解决办法
解决办法: gradlew is the gradle wrapper executable - batch script on windows and shell script elsewhere. ...
- php扩展memcached和memcache的安装配置方法:转载
本文转载:http://www.jb51.net/article/56999.htm php连接memcached缓存服务器的客户端有两个,一个是memcache是比较底层的开发库,memcached ...
- TCP学习之二:客户端与服务端的连接
主要参考张子阳大神的博客:http://www.cnblogs.com/JimmyZhang/category/101698.html TcpClient是对Socket的封装 一个TcpClient ...
- scrollView滚动原理
首先要明确的是,scrollview 其实和普通的 view 并没有多大的差别,只不过给它加上了一些手势和约定. 我们知道,要让一个 scrollview 能够滚动的方法是设置它的 contentSi ...
- Yii2 认证实现原理和示例
Yii的用户认证分为两个部分,一个是User组件,负责管理用户认证状态的,包括登录,登出,检测当前登录状态等,源文件位于vender/yiisoft/yii2/web/User.php.另一个是实现接 ...
- 面localStorage用作数据缓存的简易封装
面localStorage用作数据缓存的简易封装 最近做了一些前端控件的封装,需要用到数据本地存储,开始采用cookie,发现很容易就超过了cookie的容量限制,于是改用localStorage,但 ...
- CAIN怎么嗅探路由密码
Cain & Abel 是由Oxid.it开发的一个针对Microsoft操作系统的免费口令恢复工具.号称穷人使用的L0phtcrack.它的功能十分强大,可以网络嗅探,网络欺骗,破解加密口令 ...
- 后台访问 JS解决跨域问题
今天看了看以前做的一个小项目(其实就是一个页面),分享一下当时解决跨域问题的: 背景:公司把项目部署在多台服务器上,防止一台服务器崩溃后,其他的可以继续访问,对应本公司来说,某台服务器出问题后,技术人 ...
- ACM/ICPC 之 中国剩余定理+容斥原理(HDU5768)
二进制枚举+容斥原理+中国剩余定理 #include<iostream> #include<cstring> #include<cstdio> #include&l ...
- mysql 基础使用
mysql服务器本地root用户默认没有密码,使用 "mysql -u root -p" 即可登陆.linux本地用户可以以任意用户名登陆mysql,但是没有任何权限,没有意义.m ...