最近用的了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框架,可以结合本地缓存、内存缓存,提供图片加载的效率。

还有要注意的一点,快速滑动的时候,如一下子从第一张图片滑动到第七张图片,可能第一张图片还没加载出来,这时候第七张图片已经加载出来了,但是还是因为convertView缓存的原因,会先加载第七张图片,再加载第一张,从而导致图片错位了。

改善办法应该是给ImageView设置Tag:

  1. public void setVisableImg(int position, List<DiscoverModel> data,
  2. ImageView imageView) {
  3. String ico = ConfigureUtils.pic_url + data.get(position).getIco_url();
  4. imageView.setTag(ico);
  5.  
  6. //这句话为了解决convertView被重用时,图片预设问题
  7. imageView.setImageResource(R.drawable.img_cityhunter_review);
  8. if(imageView.getTag().equals(ico)) {
  9. // SetImageUtils.setImageRound(ico, context.getResources().getDrawable(R.drawable.img_cityhunter_review), imageView, context);
  10. SetImageUtils.setImage(ico, imageView, context);
  11. }
  12. }

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

  1. ListView 上拉加载更多

    ListView 上拉加载更多 首先来个效果图 界面布局 <?xml version="1.0" encoding="utf-8"?> <Re ...

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

    一.什么是分页加载 在下面的文章中,我们来讲解LitView分页加载的实现.什么是分页加载呢?我们先看几张效果图吧,如下:                                       ...

  3. 转: listview异步图片加载之优化篇(android)

    Listview异步加载之优化篇 关于listview的异步加载,网上其实很多示例了,总体思想差不多,不过很多版本或是有bug,或是有性能问题有待优化.有鉴于此,本人在网上找了个相对理想的版本并在此基 ...

  4. ListView用法及加载数据时的闪烁问题和加载数据过慢问题

    ListView介绍及添加数据时的闪烁问题 1.     ListView类 1.1 ListView常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示 ...

  5. Android基本控件之listView(三)<用ListView实现分页加载>

    我们之前讨论了ListView的基本使用方法和ListView的优化 今天我们再来讨论一个关于ListView的一个新的东西~就是分页加载.那么什么是分页加载呢?简单点说,就是"下拉刷新&q ...

  6. Android ListView避免多线程加载一个同一资源

    当我们的ListView中的Item包含图片,而且这些图片是同一资源,我们用多线程去加载图片,这时候可能就发生了这种情况. 比如线程是人,第一个人去做加载图片到缓存的工作,还没做好时第二个人要这同一张 ...

  7. XE7 & FMX 那些年我们一起上过的控件:ListView 之 (3) 加载数据时如何显示自定义样式

    本文介绍一下ListView下如何加载数据.及使用进度条反馈当前进度给用户. 注意: 原创作品,请尊重作者劳动成果,转载请注明出处!!!原文永久固定地址:http://www.cnblogs.com/ ...

  8. 如何在vue中监听scroll,从而实现滑动加载更多

    首先需要明确3个定义: 文档高度:整个页面的高度 可视窗口高度:你看到的浏览器可视屏幕高度 滚动条滚动高度: 滚动条下滑过的高度 当 文档高度 = 可视窗口高度 + 滚动条高度  时,滚动条正好到底. ...

  9. Flutter 开发从 0 到 1(四)ListView 下拉加载和加载更多

    在<APP 开发从 0 到 1(三)布局与 ListView>我们完成了 ListView,这篇文章将做 ListView 下拉加载和加载更多. ListView 下拉加载 Flutter ...

随机推荐

  1. 新手入门Java需要注意的问题

    学习编程,虽然有老师教,但是更重要的事自学.这是很重要的. 现在互联网上面资源太多了,这也就有一个问题:怎么才能在一定时间内学习该知识,掌握该技能呢? 理论联系实践! 学以致用!! 网上的资源太多了, ...

  2. GIS开发环境全面升级10.1

    最近,因为公司开发的需要,对开发环境进行全面的升级,在这其中也遇到了不少问题,在之后将陆续整理出来,以便以后查看. 之前开发环境:VS2008,ArcGIS9.3,ArcEngine9.3,Oracl ...

  3. hdu 5791 (DP) Two

    hdu 5791 Two Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  4. 自动化测试工具QTP和SilkTest横向PK(转)

    转自:http://www.uml.org.cn/Test/201405212.asp?artid=1686 众所周知,自动化测试工具曾几何时三足鼎立,Mercury QTP/WinRunner系.I ...

  5. 安装spy-debugger

  6. win7电脑共享VPN连接教程

    互通网络VPN服务器不限制连接数,如果仅仅是电脑连接的话有点浪费,如何只在笔记本电脑上设置一次VPN,然后手机.平板等都可以直接共享使用呢?为什么需要笔记本电脑,因为笔记本电脑内置的无线网卡可以设置w ...

  7. Backbone.js入门教程

    原文: Getting Started with Backbone.js 不像其它的Web开发语言,过去Javascript很少可用的架构.令人感到高兴的是,最近几年这种情况得到非常大的改善. 今天我 ...

  8. Git使用疑难问题分析

    Git在实际的使用过程中会遇到很多实际问题,下面对这些问题做一一分析和解决. 目录: 1. no new change问题: 2. unpacker error问题: 3. 中文乱码: 1. 推送代码 ...

  9. DBHelp数据处理类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. 在cocos2d里面如何使用Texture Packer和像素格式来优化spritesheet

    免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作 ...