欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-03-01 09:40:52
本文实例为大家介绍了android listview下拉刷新功能的实现方法和功能,供大家参考,具体内容如下 1、listview优化方式 界面缓存:viewholder...

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

1、listview优化方式

界面缓存viewholder+convertview
分页加载:上拉刷新
图片缓存
快速滑动listview禁止刷新

2、效果

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

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软件编程有所帮助。