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

关键代码如下:

 listView.setOnScrollListener(new OnScrollListener() {

             @Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
switch (scrollState) {
case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
// Log.i("fm3", "OnScrollListener : SCROLL_STATE_TOUCH_SCROLL");
adapter.setIsScrolling(true);
break;
case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
// Log.i("fm3", "OnScrollListener : SCROLL_STATE_FLING");
adapter.setIsScrolling(true);
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
//第一个可见item的position
int first = listView.getRefreshableView().getFirstVisiblePosition();
//最后一个可见item的position
int last = listView.getRefreshableView().getLastVisiblePosition();
//屏幕可见item的总数
int onScreenCount = listView.getRefreshableView().getChildCount();
adapter.setIsScrolling(false);
adapter.setPositionRange(first, last,onScreenCount);
adapter.notifyDataSetChanged();
break;
default:
break;
}
} @Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
});

adapter代码如下:

     private boolean isScrolling = false;
private int mFirstPosition = 0;
private int mLastPosition = 0;
private int onScreenCount = 0; //屏幕每次可见item个数
private List<Integer> listPosition = new ArrayList<Integer>();
  public void setIsScrolling(boolean flag) {
this.isScrolling = flag;
}
/**
* 设置滑动到item记录
* @param first
* @param last
* @param onScreenCount
*/
public void setPositionRange(int first,int last,int onScreenCount) {
this.mFirstPosition = first;
this.mLastPosition = last;
this.onScreenCount = onScreenCount;
for(int i=0;i<= onScreenCount;i++) {
int currentIndex = first + i; //从第一个可见的item--》最后可见的item
if(currentIndex > last) {
return;
}else { //对于滑动到的item进行记录
if(!listPosition.contains(currentIndex)) {
listPosition.add(currentIndex);
Log.i("fm3","添加可见item记录:"+currentIndex);
}
}
}
}

然后还有关键的getView方法:

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

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

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

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

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

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. Linux下yum升级安装PHP 5.5

    我的系统是Centos 6.5 ,安装lnmp是直接yum安装的,php版本为5.4的,当安装了最新的phpMyAdmin(4.5.1)数据库管理软件后发现不支持php5.4使用,所以只好升级下php ...

  2. URLEncoder编码

    客户端在进行网页请求的时候,网址中可能会包含非ASCII码形式的内容,比如中文. 而直接把中文放到网址中请求是不允许的,所以需要用URLEncoder编码地址, 将网址中的非ASCII码内容转换成可以 ...

  3. 转 SVN 在vs中的使用

    给大家介绍一些SVN的入门知识!希望对大家的学习起到作用!      关于SVN与CVS的相关知识,大家可以自己去google一下.      一.准备         SVN是一个开源的版本控制系统 ...

  4. MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型

    目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...

  5. 内存,堆,栈,heap,stack,data

    1. 基本类型占一块内存. 引用类型占两块. 2. 类是静态概念. 函数中定义的基本类型变量和对象的引用类型变量都在函数的栈内存. 局部变量存在栈内存. new创建的对象和数组,存在堆内存. java ...

  6. 数字电路-异同步 复位 线与 oc门

    1.同步电路和异步电路的区别是什么? 异步电路:主要是组合逻辑电路,用于产生地址译码器.FIFO或RAM的读写控制信号脉冲,但它同时也用在时序电路中,此时它没有统一的时钟,状态变化的时刻是不稳定的,通 ...

  7. nginx日志中访问最多的100个ip及访问次数

    nginx日志中访问最多的100个ip及访问次数 awk '{print $1}' /opt/software/nginx/logs/access.log| sort | uniq -c | sort ...

  8. linux 清理内存命令 查看内存命令

    查看内存: 我们可以用free命令查看内存信息: free -g total used free shared buffers cachedMem: 15   15    0     0       ...

  9. Hibernate缓存之初探

    数据层的访问效率优化可能第一想到的就是利用缓存,缓存的机能可以简单理解为将从数据库中访问的数据放在内存中,在以后再次使用到这些数据时可以直接从内存中读取而不必要再次访问数据库,尽量减少和数据库的交互提 ...

  10. 校验两次密码一致的js代码

    function checkpasswd(){ var passwd = document.getElementByIdx_x_x_xx_x('passwd').value; var repasswd ...