如转载 请注明出处 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. 1.Cocos2dx 3.2中vector,ValueMap,Touch触摸时间的使用.iconv字符编解码

     Cocos2dx3.2以后使用Vector<T>代替了CCArray.案例如下: 头文件:T02Vector.h #ifndef __T02Vector_H__ #define __ ...

  2. Android开发之Intent.Action 各种Action的常见作用

    1 Intent.ACTION_MAIN String: android.intent.action.MAIN 标识Activity为一个程序的开始.比较常用. Input:nothing Outpu ...

  3. Android Studio 不得不知的20大快捷键

    如何进入设置快捷键的界面: Android Studio -> References -> Keymap 使用的Keymaps为 Eclipse(Mac OS X)如下图所示: 1 展开和 ...

  4. Oracle启用scott用户

    先查询一下目前数据库是否有scott用户 select username,account_status from dba_users where username like '%SCOTT%'; 如果 ...

  5. JQuery纵向下拉菜单实现心得

    jquery库给我们带来了许多便利,不愧是轻量级的DOM框架,在前面的博文中小编分别对jquery的基础知识以及jquery的一些小demo有一系列的简单介绍,期待各位小伙伴的指导.使用jquery实 ...

  6. HashMap方法介绍

    1. Map的遍历方式 (1) for each map.entrySet() Map<String, String> map = new HashMap<String, Strin ...

  7. Hessian探究(一)Hessian入门示例

    一.hessian的maven信息: [html] view plain copy print? <dependency> <groupId>com.caucho</gr ...

  8. 01-Git简介和仓库创建

    Git简介 Linus的第二个伟大作品.2005年由于BitKeeper软件公司对Linux社区停止了免费使用权.Linus迫不得己自己开发了一个分布式版本控制工具,从而Git诞生了. 目前使用Git ...

  9. StringBuffer与StringBuilder详解

    刚刚在参加网易实习生在线考试的时候,出了一道选择题谈到了StringBuilder这个类的一些选项,虽然那道题自己做对了,但是也提醒了我应该好好了解一些StringBuffer与StringBuild ...

  10. J2EE学习从菜鸟变大鸟之四 JNDI(Java Naming and Directory Interface)

    掌握 J2EE 是件不是很轻松的事哈,但是很有意思,抽象抽象哈哈,因为它包含的技术和缩略语在不断地增长.Java 命名和目录接口(Java Naming and Directory Interface ...