Android Xlistview的源码浅度分析 监听ListView上下滑动 以及是否到顶和底部
如转载 请注明出处 http://blog.csdn.net/sk719887916
比如我们很多项目中会用到listview 并且要对listview滑动方向进行判断 也有需要的到listview是否是已滑到顶部和底部。这种需求一般是比如我们下滑listiew是时候影藏一个顶部的标题控件 或者展现一个顶部的提示控件,比如百家姓,电话本,就是要展现当前的首字母在屏幕中央 ,还有很多比如贴吧的app 我们对评论滑动的时候就得要去隐藏或者收缩顶部的楼主贴 这样对于小屏幕手机是一种不错的选择。现在让我们看看到底怎么去实现这个小功能。
通过看xlixtview源码他就是在监听adapter的位置 从而进行对应的刷新和加载更多的回调函数
先看看XLIstview 的关键代码
@Override public boolean onTouchEvent(MotionEvent ev) { if (mLastY == -1) { mLastY = ev.getRawY(); } switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: mLastY = ev.getRawY(); break; case MotionEvent.ACTION_MOVE: final float deltaY = ev.getRawY() - mLastY; mLastY = ev.getRawY(); if (getFirstVisiblePosition() == 0 && (mHeaderView.getVisiableHeight() > 0 || deltaY > 0)) { // the first item is showing, header has shown or pull down. updateHeaderHeight(deltaY / OFFSET_RADIO); invokeOnScrolling(); } else if (getLastVisiblePosition() == mTotalItemCount - 1 && (mFooterView.getBottomMargin() > 0 || deltaY < 0)) { // last item, already pulled up or want to pull up. updateFooterHeight(-deltaY / OFFSET_RADIO); } break; default: mLastY = -1; // reset if (getFirstVisiblePosition() == 0) { // invoke refresh if (mEnablePullRefresh && mHeaderView.getVisiableHeight() > mHeaderViewHeight) { mPullRefreshing = true; mHeaderView.setState(XListViewHeader.STATE_REFRESHING); if (mListViewListener != null) { mListViewListener.onRefresh(); } } resetHeaderHeight(); } else if (getLastVisiblePosition() == mTotalItemCount - 1) { // invoke load more. if (mEnablePullLoad && mFooterView.getBottomMargin() > PULL_LOAD_MORE_DELTA && !mPullLoading) { startLoadMore(); } resetFooterHeight(); } break; } return super.onTouchEvent(ev); }
看完你也就明白了 他就是在看是不是Position的位置 接下来言归正传 看看我们今天解决的问题
先找到xml定义好的listview 然后就在当前的activty进行初始化
之后谷歌给我们定义了一个回调监听事件 OnScrollListener 这个方法同样适用于gridview
listView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (firstVisibleItem == 0) { /* Log.e("log", "滑到顶部"); */ } if (visibleItemCount -firstVisibleItem== 4) { sets = GApplication.getInstance().shareUtil .getMyCareCityLabel(); if (sets == null) { Log.e("log", "中间"); /* handler.sendEmptyMessage(5);*/ } } if (visibleItemCount + firstVisibleItem == totalItemCount) { /* Log.e("log", "滑到底部"); */ } } });
是不是很简单呢 有了这个东西 你也可以自己去写个底部加载更多和顶部的刷新 只不过目前开源的框架是对一些ui进行封装和对onTouch事件处理 因为它比上面的方法更加精确 因为当我们滑到底部时 不知道item高度高 那么你没看完最底部的item 它就给你加载更多事件了 所以用此我们可以解决文章开头说的一些小功能 你可以在对应的位置进行一些事件操作和提示信息 一般的新手指导当你滑动listview一半时后就可以做也一些提示
接下来 这个事件完全不能满足我们更加高级的UI效果 有时候我们还要知道listview是否在滑动 是否滑动停止了 向哪个方向滑动 那么问题来了 你如果判断onTouch 那么你就必须获取点击的屏幕坐标和松开时候的坐标 这样也可以实现以上功能 但是比较费时间 现在给大家介绍下一个新的东东 其实还是上面的OnScrollListener
我们可以去实现此接口 重写他的方法
@Override public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) { } @Override public void onScrollStateChanged(AbsListView abview, int scrollState) { switch (scrollState) { // 滚动之前,手还在屏幕上 记录滚动前的下标 case OnXScrollListener.SCROLL_STATE_TOUCH_SCROLL: lvIndext = abview.getLastVisiblePosition(); break; // 滚动停止 case OnXScrollListener.SCROLL_STATE_IDLE: int scrolled = abview.getLastVisiblePosition(); if (scrolled > lvIndext) { if (tv_content.getMaxLines() != 50 && oldlines != 1) { lienar_questiondetails.startAnimation(mShowAction); tv_content.setMaxLines(50); //比如这里我们可以是伸开(显示)一个文本控件 } } // 向上滚动了 else if (scrolled < lvIndext) { if (tv_content.getMaxLines() != 1 && oldlines != 1) { lienar_questiondetails.startAnimation(mHiddenAction); tv_content.setMaxLines(1); //比如这就是收缩(隐藏)一个文本控件 } } break; } } @Override public void onXScrolling(View view) { }
可以看到 里面有正在滑动 位置改变 滑动停止事件 那么我们就可以在对应方法里面进行对应需求操作 是不是很简单呢 如有不确切地方 还需要大家的矫正。
Android Xlistview的源码浅度分析 监听ListView上下滑动 以及是否到顶和底部的更多相关文章
- Activity的绘制流程简单分析(基于android 4.0源码进行分析)
要明白这个流程,我们还得从第一部开始,大家都知道 在activity里面 setcontentview 调用结束以后 就可以看到程序加载好我们的布局文件了,从而让我们在手机上看到这个画面. 那么我们来 ...
- wemall app商城源码Fragment中监听onKey事件
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享android开发Fragment中监听onK ...
- bootstrap源码之滚动监听组件scrollspy.js详解
其实滚动监听使用的情况还是很多的,比如导航居于右侧,当主题内容滚动某一块的时候,右侧导航对应的要高亮. 实现功能 1.当滚动区域内设置的hashkey距离顶点到有效位置时,就关联设置其导航上的指定项 ...
- 监听Listview的滚动状态,是否滚动到了顶部或底部
/** * @author:Jack Tony * @description : 监听listview的滑动状态,如果到了顶部就刷新数据 * @date :2015年2月9日 */ private c ...
- MTK Android 源码目录分析
Android 源码目录分析 Android 4.0 |-- abi (application binary interface:应用二进制接口)|-- art (average retrieval ...
- Android 开源项目源码解析(第二期)
Android 开源项目源码解析(第二期) 阅读目录 android-Ultra-Pull-To-Refresh 源码解析 DynamicLoadApk 源码解析 NineOldAnimations ...
- 史上最详细的Android消息机制源码解析
本人只是Android菜鸡一个,写技术文章只是为了总结自己最近学习到的知识,从来不敢为人师,如果里面有不正确的地方请大家尽情指出,谢谢! 606页Android最新面试题含答案,有兴趣可以点击获取. ...
- Activity源码简要分析总结
Activity源码简要分析总结 摘自参考书籍,只列一下结论: 1. Activity的顶层View是DecorView,而我们在onCreate()方法中通过setContentView()设置的V ...
- MongoDB源码分析——mongod程序源码入口分析
Edit 说明:第一次写笔记,之前都是看别人写的,觉得很简单,开始写了之后才发现真的很难,不知道该怎么分析,这篇文章也参考了很多前辈对MongoDB源码的分析,也有一些自己的理解,后续将会继续分析其他 ...
随机推荐
- 全文检索概念,Lucene大致结构
1.1 常见的全文检索 1) 在window系统中,可以指定磁盘中的某一个位置来搜索你想要得到的东西. 2) 在myeclipse中,点击Help->Help Contents,可以利用搜索功能 ...
- P2P系统,一致性哈希和DHT
数据网格产品经常会使用P2P进行通信,借此机会系统地学习一下P2P网络和其资源搜索策略. 1 P2P网络架构 谈到P2P就涉及到一个概念:Overlay Network(覆盖网络).所谓覆盖网络是应用 ...
- gradle编译自定义注解(annotation)的未解决问题
最近把一个用eclipse构建的项目,加上了Gradle脚本,用它来编译.虽然最后编译是显示BUILD SUCCESSFUL,但是在编译过程中,却打印出一大堆栈信息,似乎是在编译我自定义的注解时出现的 ...
- 学习笔记-JS公开课二
typeof运算符的使用 JS中内置对象Array/Date/Math/String可以看成引用类型 做如下测试: <scripttype="text/javascript" ...
- jquery 只读
大家都理解这是什么,正常的写法如下: if (status == true) { $("#minDelistStr").val(totalAmount);// 去掉首部的" ...
- 刀片服务器和磁盘阵列卡(RAID)技术---永和维护
近期客户需要更换服务器,客户把买好的服务器送来了,原本感觉很小的一个服务器,可当我看到的时候是一个大个的又长又宽,类似机房服务器的那种,后来米老师给大致讲解一番:这个是刀片服务器. 刀片服务器是指在标 ...
- Android(Lollipop/5.0) Material Design(二) 入门指南
Material Design系列 Android(Lollipop/5.0)Material Design(一) 简介 Android(Lollipop/5.0)Material Design(二) ...
- Chapter 1 Securing Your Server and Network(14):限制功能——xp_cmdshell 和OPENROWSET
原文出处:http://blog.csdn.net/dba_huangzj/article/details/38656615,专题目录:http://blog.csdn.net/dba_huangzj ...
- 一个大数据方案:基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎
网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并提供了大量的配置定制选项.由于网络爬虫只负责网络资源的抓取,所以,需要一个分布式搜索引擎, ...
- Dynamics CRM2013 任务列表添加自定义按钮
任务列表的command bar 上面添加自定义按钮如下 要注意的是此处的列表不是任务实体而是活动实体,如果你是在任务实体的home栏上面加那你永远看不见按钮的显示,但如果是要在任务的表单界面上加按钮 ...