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源码的分析,也有一些自己的理解,后续将会继续分析其他 ...
随机推荐
- 1.Cocos2dx 3.2中vector,ValueMap,Touch触摸时间的使用.iconv字符编解码
Cocos2dx3.2以后使用Vector<T>代替了CCArray.案例如下: 头文件:T02Vector.h #ifndef __T02Vector_H__ #define __ ...
- Android开发之Intent.Action 各种Action的常见作用
1 Intent.ACTION_MAIN String: android.intent.action.MAIN 标识Activity为一个程序的开始.比较常用. Input:nothing Outpu ...
- Android Studio 不得不知的20大快捷键
如何进入设置快捷键的界面: Android Studio -> References -> Keymap 使用的Keymaps为 Eclipse(Mac OS X)如下图所示: 1 展开和 ...
- Oracle启用scott用户
先查询一下目前数据库是否有scott用户 select username,account_status from dba_users where username like '%SCOTT%'; 如果 ...
- JQuery纵向下拉菜单实现心得
jquery库给我们带来了许多便利,不愧是轻量级的DOM框架,在前面的博文中小编分别对jquery的基础知识以及jquery的一些小demo有一系列的简单介绍,期待各位小伙伴的指导.使用jquery实 ...
- HashMap方法介绍
1. Map的遍历方式 (1) for each map.entrySet() Map<String, String> map = new HashMap<String, Strin ...
- Hessian探究(一)Hessian入门示例
一.hessian的maven信息: [html] view plain copy print? <dependency> <groupId>com.caucho</gr ...
- 01-Git简介和仓库创建
Git简介 Linus的第二个伟大作品.2005年由于BitKeeper软件公司对Linux社区停止了免费使用权.Linus迫不得己自己开发了一个分布式版本控制工具,从而Git诞生了. 目前使用Git ...
- StringBuffer与StringBuilder详解
刚刚在参加网易实习生在线考试的时候,出了一道选择题谈到了StringBuilder这个类的一些选项,虽然那道题自己做对了,但是也提醒了我应该好好了解一些StringBuffer与StringBuild ...
- J2EE学习从菜鸟变大鸟之四 JNDI(Java Naming and Directory Interface)
掌握 J2EE 是件不是很轻松的事哈,但是很有意思,抽象抽象哈哈,因为它包含的技术和缩略语在不断地增长.Java 命名和目录接口(Java Naming and Directory Interface ...