Android ListView实现上拉加载更多和下拉刷新功能

所属分类: 软件编程 / Android 阅读数: 1074
收藏 0 赞 0 分享

本文实例为大家介绍了Android ListView下拉刷新功能的实现方法和功能,供大家参考,具体内容如下

1、ListView优化方式

界面缓存ViewHolder+convertView
分页加载:上拉刷新
图片缓存
快速滑动ListView禁止刷新

2、效果

3、上拉加载更多原理及实现

当我们手指滑动到listview最后位置的时候,我们触发加载数据的方法。这触发之前我们需要做一些工作,包括:

如何判断滑动到最后?

如何避免重复加载数据?

加载之后如何刷新界面?

1)、界面实现AbsListView.OnScrollListener接口,当firstVisibleItem + visibleItemCount >= totalItemCount即可判断滑动到了最下面;
2)、为了不重复加载数据,例如当我手指滑动到最下面,手指立马离开,然后再马上滑动,就会导致数据拉取两次,我们利用mHandler.hasMessages(LOAD)判断消息队列中是否已经存在这个消息;
3)、我们在handler中加载新数据,并且利用 mStringArrayAdapter.notifyDataSetChanged();通知界面刷新。

 int result1;
 int result2;
 //监听状态改变
 @Override
 public void onScrollStateChanged(AbsListView view, int scrollState) {
 switch (scrollState) {
 case SCROLL_STATE_IDLE:
 //滑动结束
 break;
 case SCROLL_STATE_FLING:
 //手指离开屏幕
 if (result1 >= result2) {
  //只发送一次,防止多次加载数据
  if (!mHandler.hasMessages(LOAD))
  mHandler.sendEmptyMessageDelayed(LOAD, 5000);
 }
 break;
 case SCROLL_STATE_TOUCH_SCROLL:
 //滑动中
 break;
 }
 }

 //滑动结束之后执行
 @Override
 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
 // Log.e(TAG, "firstVisibleItem:" + firstVisibleItem + "---visibleItemCount:" + visibleItemCount + "--totalItemCount:" + totalItemCount);
 //加载到最后
 if (firstVisibleItem + visibleItemCount >= totalItemCount) {
 //这里不处理,在上面状态改变结束之后再处理
 }
 }

4、下拉加刷新原理及实现

下拉刷新核心原理和上拉加载核心原理一致,只是有细节不同。我们需要处理以下问题:如何判断用户当前位置在数据第一条?如何判断用户在第一条的同时下拉一定距离?如何刷新更新界面(上面已经解决)?

1)、注意事项:

初始化应该设置默认上面的刷新图标隐藏,在ProgressBar中设置Android:visibility="gone";这样设置还不行,还需要设置 mListView.setSelection(1);让当前第一列是第一条数据。同样的,在加载完成之后也要设置mListView.setSelection(1);,显示第一行。

2)、实现

*判断第一条的方式mListView.getFirstVisiblePosition()==0
*mListView实现 mListView.setOnTouchListener方法,来根据用户手指按下的位置以及抬起的位置,计算这两者的距离与我们规定的距离(如100)的大小,如大于就进行刷新操作。
*刷新之后通知界面mStringArrayAdapter.notifyDataSetChanged();

 mListView.setOnTouchListener(new View.OnTouchListener() {
 @Override
 public boolean onTouch(View v, MotionEvent event) {

 switch (event.getAction()) {
  case MotionEvent.ACTION_DOWN:
  startY=event.getY();
  break;
  case MotionEvent.ACTION_MOVE:
  break;
  case MotionEvent.ACTION_UP:
  endY=event.getY();
  if(endY-startY> DISTANT&&(mListView.getFirstVisiblePosition()==1||mListView.getFirstVisiblePosition()==0)){
  if(!mHandler.hasMessages(FRESH)){
  mProgressBar_top.setVisibility(View.VISIBLE);
  //notif
  mHandler.sendEmptyMessageDelayed(FRESH,5000);
  }

  }
  break;
 }
 //不能返回true,不然直接消费掉了
 return false;
 }
 });

以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。

更多精彩内容其他人还在看

Android中加入名片扫描功能实例代码

这篇文章主要介绍了Android中加入名片扫描功能实例代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Android仿微信发表说说实现拍照、多图上传功能

这篇文章主要为大家详细介绍了Android仿微信发表说说实现拍照、多图上传功能,使用Retrofit2.0技术,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

设置Android系统永不锁屏永不休眠的方法

在进行Android系统开发的时候,有些特定的情况需要设置系统永不锁屏,永不休眠。本篇文章给大家介绍Android 永不锁屏,开机不锁屏,删除设置中休眠时间选项,需要的朋友一起学习吧
收藏 0 赞 0 分享

Android Retrofit 2.0框架上传图片解决方案

这篇文章主要介绍了Android Retrofit 2.0框架上传一张与多张图片解决方案,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android自定义等待对话框

这篇文章主要为大家详细介绍了Android自定义等待对话框的实现方法,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android中Window添加View的底层原理

这篇文章主要介绍了Android中Window添加View的底层原理,需要的朋友可以参考下
收藏 0 赞 0 分享

Android调用系统默认浏览器访问的方法

这篇文章主要介绍了Android调用系统默认浏览器访问的方法的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Android开发退出程序的方法汇总

Android程序有很多Activity,比如说主窗口A,调用了子窗口B,子窗口B又调用子窗口C,back返回子窗口B后,在B中如何关闭整个Android应用程序呢? 下面脚本之家小编就给大家介绍android开发退出程序的几种方法,感兴趣的朋友参考下吧
收藏 0 赞 0 分享

Android程序开发中单选按钮(RadioGroup)的使用详解

在android程序开发中,无论是单选按钮还是多选按钮都非常的常见,接下来通过本文给大家介绍Android程序开发中单选按钮(RadioGroup)的使用,需要的朋友参考下吧
收藏 0 赞 0 分享

Android实现仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中

这篇文章主要介绍了Android实现仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多