如转载 请注明出处 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上下滑动 以及是否到顶和底部的更多相关文章

  1. Activity的绘制流程简单分析(基于android 4.0源码进行分析)

    要明白这个流程,我们还得从第一部开始,大家都知道 在activity里面 setcontentview 调用结束以后 就可以看到程序加载好我们的布局文件了,从而让我们在手机上看到这个画面. 那么我们来 ...

  2. wemall app商城源码Fragment中监听onKey事件

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享android开发Fragment中监听onK ...

  3. bootstrap源码之滚动监听组件scrollspy.js详解

    其实滚动监听使用的情况还是很多的,比如导航居于右侧,当主题内容滚动某一块的时候,右侧导航对应的要高亮. 实现功能 1.当滚动区域内设置的hashkey距离顶点到有效位置时,就关联设置其导航上的指定项 ...

  4. 监听Listview的滚动状态,是否滚动到了顶部或底部

    /** * @author:Jack Tony * @description : 监听listview的滑动状态,如果到了顶部就刷新数据 * @date :2015年2月9日 */ private c ...

  5. MTK Android 源码目录分析

    Android 源码目录分析 Android 4.0 |-- abi (application binary interface:应用二进制接口)|-- art (average retrieval ...

  6. Android 开源项目源码解析(第二期)

    Android 开源项目源码解析(第二期) 阅读目录 android-Ultra-Pull-To-Refresh 源码解析 DynamicLoadApk 源码解析 NineOldAnimations ...

  7. 史上最详细的Android消息机制源码解析

    本人只是Android菜鸡一个,写技术文章只是为了总结自己最近学习到的知识,从来不敢为人师,如果里面有不正确的地方请大家尽情指出,谢谢! 606页Android最新面试题含答案,有兴趣可以点击获取. ...

  8. Activity源码简要分析总结

    Activity源码简要分析总结 摘自参考书籍,只列一下结论: 1. Activity的顶层View是DecorView,而我们在onCreate()方法中通过setContentView()设置的V ...

  9. MongoDB源码分析——mongod程序源码入口分析

    Edit 说明:第一次写笔记,之前都是看别人写的,觉得很简单,开始写了之后才发现真的很难,不知道该怎么分析,这篇文章也参考了很多前辈对MongoDB源码的分析,也有一些自己的理解,后续将会继续分析其他 ...

随机推荐

  1. 全文检索概念,Lucene大致结构

    1.1 常见的全文检索 1) 在window系统中,可以指定磁盘中的某一个位置来搜索你想要得到的东西. 2) 在myeclipse中,点击Help->Help Contents,可以利用搜索功能 ...

  2. P2P系统,一致性哈希和DHT

    数据网格产品经常会使用P2P进行通信,借此机会系统地学习一下P2P网络和其资源搜索策略. 1 P2P网络架构 谈到P2P就涉及到一个概念:Overlay Network(覆盖网络).所谓覆盖网络是应用 ...

  3. gradle编译自定义注解(annotation)的未解决问题

    最近把一个用eclipse构建的项目,加上了Gradle脚本,用它来编译.虽然最后编译是显示BUILD SUCCESSFUL,但是在编译过程中,却打印出一大堆栈信息,似乎是在编译我自定义的注解时出现的 ...

  4. 学习笔记-JS公开课二

    typeof运算符的使用 JS中内置对象Array/Date/Math/String可以看成引用类型 做如下测试: <scripttype="text/javascript" ...

  5. jquery 只读

    大家都理解这是什么,正常的写法如下: if (status == true) { $("#minDelistStr").val(totalAmount);// 去掉首部的" ...

  6. 刀片服务器和磁盘阵列卡(RAID)技术---永和维护

    近期客户需要更换服务器,客户把买好的服务器送来了,原本感觉很小的一个服务器,可当我看到的时候是一个大个的又长又宽,类似机房服务器的那种,后来米老师给大致讲解一番:这个是刀片服务器. 刀片服务器是指在标 ...

  7. Android(Lollipop/5.0) Material Design(二) 入门指南

    Material Design系列 Android(Lollipop/5.0)Material Design(一) 简介 Android(Lollipop/5.0)Material Design(二) ...

  8. 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 ...

  9. 一个大数据方案:基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎

    网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并提供了大量的配置定制选项.由于网络爬虫只负责网络资源的抓取,所以,需要一个分布式搜索引擎, ...

  10. Dynamics CRM2013 任务列表添加自定义按钮

    任务列表的command bar 上面添加自定义按钮如下 要注意的是此处的列表不是任务实体而是活动实体,如果你是在任务实体的home栏上面加那你永远看不见按钮的显示,但如果是要在任务的表单界面上加按钮 ...