为什么

先说为什么有照片反弹。

使用convertView对ListView的每一个item优化,item的复用能够有效减少内存的占用。使ListView滑动更为流畅。

但会带来一个问题,当最顶部的item滑出屏幕时。会变成下一个从底部将要滑进来的item。每次滑进来的item都要去请求网络获得图片。

第一个item滑出去时,是带着图片的。

其ImageView指向了一块内存。当其慢慢滑出,从底部慢慢滑进时,底部的item与顶部(仅仅有一半在屏幕里能看到了)的还是指向

同一块内存。载入的了同一张图片。

可是底部的item仅仅要一滑进来,就開始请求网络,要获取图片了。当底部item获取图片成功会将原有的图片覆盖。

当每一个item都是这种运行逻辑。整个item就会变得非常乱,图片乱闪。

怎样解决

解决问题有两个思路:

一个是为在item复用时,检查ImageView上是否为空,假设不为空(有图片)。则

viewHolder.imageview.setVisiable(View.GONE);

然后这个item会继续运行请求网络图片,当请求下来的图片不为空(请求成功,而且设置成功),此时在viewHolder.imageview.setVisiable(View.VISIABLE);

以下是另外一种思路的具体过程。

具体过程

布局文件:仅仅有一个ListView

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"> <ListView
android:id="@+id/lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/> </RelativeLayout>

ListView每一个item布局

<?

xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <ImageView
android:id="@+id/item_iv"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center_horizontal"
android:src="@drawable/ic_launcher"/> </LinearLayout>

重点来了。MyAdapter中getView()方法,有两个重点。

public MyAdapter(Context context,List<Info> data){
this.context = context;
this.data = data;
} @Override
public View getView(int position, View convertView, final ViewGroup parent) {
final ViewHolder holder;
if(convertView ==null){
...
}else{
...
}
//获得集合中实体类对象
final Info info = data.get(position);
//获得图片网址
final String img = info.getImgUrl(); <span style="color:#ff0000;">//重点1,为每一个ImageView设置一个tag。值为图片网址(保证tag的唯一性)。 </span>
holder.iv.setTag(info.getImgUrl());
... Bitmap bitmap =/*网络请求来的bitmap*/ <span style="color:#ff0000;">//重点2。获得tag的值。与该item中缩放图片的网址进行比較</span>
String tag = (String) holder.iv.getTag();
<span style="color:#ff0000;">//假设这个imageview的值,和他应该放的图片的地址值一样,说明这个图片是属于这个ImageView的。能够载入。 </span>
if(tag!=null&&tag.equals(info.getImg())){
iv.setImageBitmap(bitmap);
} return convertView;
} class ViewHolder{
TextView tv;
ImageView iv; }

转载请注明出处:http://blog.csdn.net/bless2015/article/details/46445325

版权声明:本文博主原创文章,博客,未经同意不得转载。

[android]完美的解决方案ListView加载网络图片反弹问题的更多相关文章

  1. 详解ListView加载网络图片的优化,让你轻松掌握!

    详解ListView加载网络图片的优化,让你轻松掌握! 写博客辛苦了,转载的朋友请标明出处哦,finddreams(http://blog.csdn.net/finddreams/article/de ...

  2. Android三种基本的加载网络图片方式(转)

    Android三种基本的加载网络图片方式,包括普通加载网络方式.用ImageLoader加载图片.用Volley加载图片. 1. [代码]普通加载网络方式 ? 1 2 3 4 5 6 7 8 9 10 ...

  3. Android笔记之使用Glide加载网络图片、下载图片

    Glide简介 不想说太多,真的很方便:P)可以节省我不少时间 GitHub地址:https://github.com/bumptech/glide 加载网络图片到ImageView Glide.wi ...

  4. Android中用双缓存技术,加载网络图片

    最近在学校参加一个比赛,写的一个Android应用,里面要加载大量的网络图片,可是用传统的方法图片一多就会造成程序出现内存溢出而崩溃.因为自己也在学习中,所以看了很多博客和视频,然后参照这些大神的写源 ...

  5. listview加载网络图片

    ListView加载网络数据和图片 2013-09-25 00:08:10|  分类: 默认分类 |  标签:android  |举报|字号 订阅     如,从服务器端获得商品名称.价格.简介和图片 ...

  6. 详解ListView加载网络图片的优化

    我们来了解一些ListView在加载大量网络图片的时候存在的常见问题: 1.性能问题,ListView的滑动有卡顿,不流畅,造成非常糟糕的用户体验. 2.图片的错位问题. 3.图片太大,加载Bitma ...

  7. Android笔记之使用ImageView加载网络图片以及保存图片到本地并更新图库

    ImageView显示网络图片 findViewById(R.id.btnLoad).setOnClickListener(new View.OnClickListener() { @Override ...

  8. wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...

  9. Android Volley入门到精通:使用Volley加载网络图片

    在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法.本篇文章中我们即将学习关于Volley更加高级的用法,如何你还没有看过我的上一篇文章的话,建议先去阅读Android Volley完 ...

随机推荐

  1. macos中xcode使用opencv,错误总结

    使用opencv时,进行编译时,会出现如上图所示错误,按图示更改就行了(我编译出来的有2处)主要参考 https://blog.csdn.net/fk1174/article/details/7011 ...

  2. 【Educational Codeforces Round 31 B】Japanese Crosswords Strike Back

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 所有数字的和加上n-1,如果为x则唯一,否则不唯一 [代码] #include <bits/stdc++.h> usin ...

  3. 将html转换为word文档的几种方式

    1 基于wps直接将页面信息下载成word文档 public void test() { WPS.Application wps = null; try { wps = new WPS.Applica ...

  4. zoj 2724 Windows Message Queue 优先队列

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1724 题目大意: 给出两种操作,GET要求取出当前队首的元素,而PUT会输入名 ...

  5. 10.3、android输入系统_必备Linux编程知识_任意进程双向通信(scoketpair+binder)

    3. 任意进程间通信(socketpair_binder) 进程每执行一次open打开文件,都会在内核中有一个file结构体表示它: 对每一个进程在内核中都会有一个task_struct表示进程,这个 ...

  6. Nginx和Nginx+的比較(下)

    Nginx和Nginx+的比較(下) 作者:chszs.未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 内容紧接上一篇<Nginx和 ...

  7. AForge,Emgu.CV抓拍图像大小

    原文:AForge,Emgu.CV抓拍图像大小 2017年,忙忙碌碌地过去了,象往年一样,依然没有时间上CSDN,博客园. 这一年是打工以来最辛苦的一年. 这一年用了不少自己没有接触过的东西.如人脸识 ...

  8. OpenStack 之 Nova Compute 的代码结构图

    nova-compute 的代码结构图 如上图所看到的, 类图中最重要的三个Category Manager: 核心的业务类.提供实际的业务操作.比如启动虚拟机等等. Service: 每一个serv ...

  9. Windows Phone 8.1 FilePicker API

    在 Windows Phone 8.1 中,增加了 FilePicker 的方式与文件打交道,最大的亮点在于这种方式不仅可以浏览手机上的文件,还可以浏览符合协议的应用里的文件! 比如点击 OneDri ...

  10. catalina.out 和 catalina.log 的区别和用途

    catalina.out catalina.out其实是tomcat的标准输出(stdout)和标准出错(stderr),这是在tomcat的启动脚本里指定的,如果没有修改的话stdout和stder ...