[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完 ...
随机推荐
- 算法-对分查找(二分查找)C++实现
这个是个主要的查找算法.由于仅仅是把数读入就须要(N)的时间量,因此我们在说这类问题的时候都是如果读入过的. 在算法经常使用的时间.将问题缩小为一部分(大约1/2),那么我们就觉得这个算法是O(log ...
- [Err] 1136 - Column count doesn't match value count at row 1
1 错误描写叙述 [Err] 1136 - Column count doesn't match value count at row 1 Procedure execution failed 113 ...
- php 面试题一(看视频的学习量比网上瞎转悠要清晰和明了很多)(看视频做好笔记)(注重复习)
php 面试题一(看视频的学习量比网上瞎转悠要清晰和明了很多)(看视频做好笔记)(注重复习) 一.总结 1.无线分类的本质是树(数据结构)(数的话有多种储存结构可以实现,所以对应的算法也有很多),想到 ...
- Spring Boot初步认识
Spring Boot 来源及背后 Spring Boot开发始于 2013 年,伴随Spring4.0而生,2014 年 4 月发布 1.0.0 版本.当前版本1.4.0,http://projec ...
- WindowImplBase::OnSysCommand-------duilib在最大化和还原间切换
virtual LRESULT OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if( wPar ...
- UI组件之TextView及其子类(三)ToggleButton和Switch
ToggleButton.Switch.CheckBox和RadioButton都是继承自android.widget.CompoundButton,意思是可选择的,因此它们的使用方法都非常类似. C ...
- 闪回drop恢复表后sql运行计划异常
-----正常运行计划 set autotrace traceonly set linesize 1000 select /*+index(t idx_object_id)*/ * from t wh ...
- 用strace排查故障的5种简单方法(每日一译)
原文链接:5 simple ways to troubleshoot using Strace 我很意外大部分人都不知道如何使用strace.strace一直是我的首选debug工具,因为它非常的有效 ...
- keil编译后Program Size: Code=46284 RO-data=988 RW-data=580 ZI-data=1094588
Program Size: Code=46284 RO-data=988 RW-data=580 ZI-data=1094588 Code : 程序中代码所占字节大小 RO-data : ...
- angular的学习参考材料
原文地址:https://www.jianshu.com/p/b9db7bb3d4ec 目的 其实写这篇文章的主要目的是为了提供给那些刚刚入门angular或者有意学习angular的读者准备的. 我 ...