[android]完美的解决方案ListView加载网络图片反弹问题
为什么
先说为什么有照片反弹。
使用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加载网络图片反弹问题的更多相关文章
- 详解ListView加载网络图片的优化,让你轻松掌握!
详解ListView加载网络图片的优化,让你轻松掌握! 写博客辛苦了,转载的朋友请标明出处哦,finddreams(http://blog.csdn.net/finddreams/article/de ...
- Android三种基本的加载网络图片方式(转)
Android三种基本的加载网络图片方式,包括普通加载网络方式.用ImageLoader加载图片.用Volley加载图片. 1. [代码]普通加载网络方式 ? 1 2 3 4 5 6 7 8 9 10 ...
- Android笔记之使用Glide加载网络图片、下载图片
Glide简介 不想说太多,真的很方便:P)可以节省我不少时间 GitHub地址:https://github.com/bumptech/glide 加载网络图片到ImageView Glide.wi ...
- Android中用双缓存技术,加载网络图片
最近在学校参加一个比赛,写的一个Android应用,里面要加载大量的网络图片,可是用传统的方法图片一多就会造成程序出现内存溢出而崩溃.因为自己也在学习中,所以看了很多博客和视频,然后参照这些大神的写源 ...
- listview加载网络图片
ListView加载网络数据和图片 2013-09-25 00:08:10| 分类: 默认分类 | 标签:android |举报|字号 订阅 如,从服务器端获得商品名称.价格.简介和图片 ...
- 详解ListView加载网络图片的优化
我们来了解一些ListView在加载大量网络图片的时候存在的常见问题: 1.性能问题,ListView的滑动有卡顿,不流畅,造成非常糟糕的用户体验. 2.图片的错位问题. 3.图片太大,加载Bitma ...
- Android笔记之使用ImageView加载网络图片以及保存图片到本地并更新图库
ImageView显示网络图片 findViewById(R.id.btnLoad).setOnClickListener(new View.OnClickListener() { @Override ...
- wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...
- Android Volley入门到精通:使用Volley加载网络图片
在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法.本篇文章中我们即将学习关于Volley更加高级的用法,如何你还没有看过我的上一篇文章的话,建议先去阅读Android Volley完 ...
随机推荐
- @RequestMapping value 能够反复吗 [
@RequestMapping value 能够反复吗 [问题点数:40分,结帖人wangqiao4j] 不显示删除回复显示全部回复 显示星级回复显示得分回复 仅仅显示楼主 u=http://bbs. ...
- Redis学习笔记--Hash(五)
Redis的数据是通过key-value的方式存储的,对于value的数据类型有字符串.Hash.list.set.sortedSet在redis命令语句中,语句是忽略大小写的,但是key是不可以忽略 ...
- xmppframework开发基础
xmppframework是XMPP协议的一个objective-c实现. 要了解xmppframework, 从这里開始吧:https://github.com/robbiehanson/XMPPF ...
- 自定义 matplotlib 设置
Customizing plots with style sheets import matplotlib as mpl 查看配置文件所在的目录:mpl.get_configdir() 1. 自定义 ...
- 详解HTML的a标签(超链接标签)
原文 简书原文:https://www.jianshu.com/p/d6a2499db73b 大纲 1.什么是<a>标签 2.<a>标签的几个重要属性 3.a标签的运行机制 4 ...
- 正确理解Spring事务和数据库事务和锁
Lock wait timeout exceeded; try restarting transaction解决方案 参考文章 Spring中@Transactional事务回滚 http://www ...
- java之Thread.sleep(long)与object.wait()/object.wait(long)的区别及相关概念梳理(good)
一.Thread.sleep(long)与object.wait()/object.wait(long)的区别sleep(long)与wait()/wait(long)行为上有些类似,主要区别如下:1 ...
- 有关下拉列表、复选框、单选按钮、iframe等jquery处理方法
1.jquery验证复选框互斥选项,代码如下: //验证复选框中的互斥选项 function checkData(name, val1, val2){ //获取所有checkbox值 var chec ...
- tomcat 设置session过期时间(四种方式)
1.在tomcat-->conf-->servler.xml文件中定义: <Context path="/test" docBase="/test&qu ...
- [Jenkins] Define a pipeline
node{ stage 'checkout' git '[github_url]' def project_path="[project_path]" // everythin i ...