ListView、PullToRefreshListView滑动加载可见item

最近用的了PullToRefreshListView框架,也在listView中加载图片,对于滑动加载可见item,网上找了一些相关文档,但都不太合适,如:http://blog.csdn.net/zhouzme/article/details/19298337?utm_source=tuicool&utm_medium=referral   不过,大体思路总算清晰了,也就是对于listView做滑动事件监听,关键获取到当前可见item的index序号,从first->last,如有不对的,请大家指导下:

关键代码如下:

 1 listView.setOnScrollListener(new OnScrollListener() {
 2
 3             @Override
 4             public void onScrollStateChanged(AbsListView view, int scrollState) {
 5                 // TODO Auto-generated method stub
 6                 switch (scrollState) {
 7                 case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
 8             //        Log.i("fm3", "OnScrollListener : SCROLL_STATE_TOUCH_SCROLL");
 9                     adapter.setIsScrolling(true);
10                     break;
11                 case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
12             //        Log.i("fm3", "OnScrollListener : SCROLL_STATE_FLING");
13                     adapter.setIsScrolling(true);
14                 case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
15                     //第一个可见item的position
16                     int first = listView.getRefreshableView().getFirstVisiblePosition();
17                     //最后一个可见item的position
18                     int last = listView.getRefreshableView().getLastVisiblePosition();
19                     //屏幕可见item的总数
20                     int onScreenCount = listView.getRefreshableView().getChildCount();
21                     adapter.setIsScrolling(false);
22                     adapter.setPositionRange(first, last,onScreenCount);
23                     adapter.notifyDataSetChanged();
24                     break;
25                 default:
26                     break;
27                 }
28             }
29
30             @Override
31             public void onScroll(AbsListView view, int firstVisibleItem,
32                     int visibleItemCount, int totalItemCount) {
33                 // TODO Auto-generated method stub
34             }
35         });

adapter代码如下:

 1     private boolean isScrolling = false;
 2     private int mFirstPosition = 0;
 3     private int mLastPosition = 0;
 4     private int onScreenCount = 0; //屏幕每次可见item个数
 5     private List<Integer> listPosition = new ArrayList<Integer>();
 6   public void setIsScrolling(boolean flag) {
 7         this.isScrolling = flag;
 8     }
 9     /**
10      * 设置滑动到item记录
11      * @param first
12      * @param last
13      * @param onScreenCount
14      */
15     public void setPositionRange(int first,int last,int onScreenCount) {
16         this.mFirstPosition = first;
17         this.mLastPosition = last;
18         this.onScreenCount = onScreenCount;
19         for(int i=0;i<= onScreenCount;i++) {
20             int currentIndex = first + i;   //从第一个可见的item--》最后可见的item
21             if(currentIndex > last) {
22                 return;
23             }else {                        //对于滑动到的item进行记录
24                 if(!listPosition.contains(currentIndex)) {
25                     listPosition.add(currentIndex);
26                     Log.i("fm3","添加可见item记录:"+currentIndex);
27                 }
28             }
29         }
30     }

然后还有关键的getView方法:

1 //初始化时自动加载
2  if(this.mLastPosition == 0 || listPosition.contains(position)) {
3       this.setVisableImg(position, data, holder.imgIco);
4  }

也就是关键维护一个记录可见item的ArrayList,如果出现过了,那么滑动到该item才加载。
而对于图片请求网络部分,使用最常用的universal-image-loader框架,可以结合本地缓存、内存缓存,提供图片加载的效率。

时间: 2024-10-25 03:04:04

ListView、PullToRefreshListView滑动加载可见item的相关文章

ListView上拉加载和下拉刷新多种实现方式

ListView上拉加载和下拉刷新多种实现方式 该篇为ListView下拉刷新和上拉加载实现的各种方法大合集.可能在具体的细节逻辑上处理不太到位,但基本上完成逻辑的实现.细节方面,个人可以根据自己的需求进行完善. 该博客将以四种思路来完成下拉刷新和上拉加载 自定义View实现上拉加载和下拉刷新 使用PullToRefresh 实现上拉加载和下拉刷新 使用Ultra-Pull-To-Refresh实现上拉加载和下拉刷新 使用SwipeToRefreshLayout实现上拉加载和下拉刷新 如果你对L

android UI进阶之实现listview的分页加载

 分享了下拉刷新,这是一个用户体验非常好的操作方式.新浪微薄就是使用这种方式的典型. 还有个问题,当用户从网络上读取微薄的时候,如果一下子全部加载用户未读的微薄这将耗费比较长的时间,造成不好的用户体验,同时一屏的内容也不足以显示如此多的内容.这时候,我们就需要用到另一个功能,那就是listview的分页了.通过分页分次加载数据,用户看多少就去加载多少. 通常这也分为两种方式,一种是设置一个按钮,用户点击即加载.另一种是当用户滑动到底部时自动加载.今天我就和大家分享一下这个功能的实现. 首先,

ListView的网络加载(使用LRU缓存,滚动监听器)

public class MainActivity extends AppCompatActivity { private List<Newsbeans> mlist; private static String url="http://www.imooc.com/api/teacher?type=4&num=30"; private ListView listView; @Override protected void onCreate(Bundle savedI

ListView实现分页加载(一)制作Demo

一.什么是分页加载 在下面的文章中,我们来讲解LitView分页加载的实现.什么是分页加载呢?我们先看几张效果图吧,如下:                                               效果说明:我们向上滑动ListView的时候,当滑动的最底部, 便会出现正在加载的进度条,当加载完成后,会出现加载后的数据.如此反复,这其实就是ListView的分页加载功能.像这样的工能,实在是太常见了.那么它是怎么实现的呢? 实现原理很简单,本质上,其实就是一个自定义的ListV

Android Demo之旅 ListView底部添加加载更多按钮实现数据分页

在我们的实际项目中,数据应该说是很多的,我们的ListView不可能一下子把数据全部加载进来,我们可以当滚动条滚动到ListView的底部的时候,给一个更多的提示,当我们点击它即加载下一页的数据,相当与我们的分页效果,参考网上的东西,写了一个小小的demo,并总结了一些知识点,功能图如下:    源代码下载地址:http://download.csdn.net/detail/harderxin/7762625 掌握知识点: 1)自定义Adapter,将数据和ListView绑定起来 2)理解La

Android中ListView上拉加载更多及下拉刷新

做几乎每一个Android应用开发,都少不了用到一个控件,那就是ListView,用于加载多条数据,并用一定的样式展示出来.但是为了性能问题(一次性加载太多数据,比如100000条,耗费时间长,消耗资源多等)及用户体验问题(比如用户只想看最新的10条数据,结果一下子把所有的上万条数据都加载了,不方便用户选择)等原因,所以我们要把ListView的数据进行分页加载,常用的就是ListView的上拉加载更多及下拉刷新最新数据. 我们可以自己封装一个带上下拉功能的ListView,通常就是加上头部He

续说ListView重用之加载图片

最近领养了一直小狗狗,据狗主人说是只阿拉斯加,求大伙见证. 不管他是不是阿拉斯加,我还是得养着,取名"蛋蛋". 继续谈技术. 说到listview里加载图片永远是个说不完的话题. 在listview中如果每个item都有图片需要下载的话,我们就得考虑由于大量图片加载而导致的oom(out of memory)问题. 一个典型的做法是,下载图片的时候看看缓存中有没有该图片,如果缓存中没有,就从sd卡中读取,如果sd卡中还没有,再去服务器下载,下载下来的图片先放在sd卡中,并放到缓存中.如

listview的数据加载

效果如图: listview的数据加载,主要用了Scroll监听来判断其位置是否需要加载信息,如果需要加载信息就先显示加载数据的view,然后进行数据的加载,加载完成后,设加载数据的view不可见,如果加载数据的时候数据位null,这时就移除这个view. listView.addFooterView(moreView); // 添加底部view(上图中的数据加载中...),一定要在setAdapter之前添加,否则会报错. listView.removeFooterView(moreView)

ListView上拉加载下拉刷新

主要用到了这个几个文件,MainActivity是界面的Activity,MyAdapter是ListView的自定义适配,MyListView是自定义带头部LIistView,如果只需要上拉加载就不需要:activity_main.xml是住界面,item.xml是ListView的子布局里面只有一个TextView,listview_footer.xml是listview的加载更多的底部布局,listview_header.xml是listview的头部布局. MainActivity.ja