============问题描述============

学做android,自己想模仿QQ空间做一个小demo
listview异步加载图片的时候遇到了一个问题
异步加载用到了SoftReference 和文件缓存的方法
每次加载图片的时候,也在内存或缓存中找到了图片
第一次加载出来后,listview滑动了,同样也进到了setImageBitmap这一步
可是就是图片显示不出来变成空白
下面帖几张图和代码
滑动前

滑动后

Image_url = new StringBuffer(AppConstant.DOWNLOAD_IMAGE_URL).append(msg.getOPImageList().get(0).getImageUrl()).toString();ImageView imageView = holder.msgImage;imageView.setTag(Image_url);Bitmap bitmap = Loader.loadBitmap(imageView, Image_url,new ImageCallBack() {@Overridepublic void imageLoad(ImageView imageView, Bitmap bitmap) {if (imageView.getTag() != null&& imageView.getTag().equals(Image_url)) {imageView.setImageBitmap(bitmap);}}});Log.e("当前的postion", "" + position);if (bitmap == null) {imageView.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_launcher));} else {imageView.setImageBitmap(bitmap);}

loader

public class Loader {/*** 内存图片软引用缓冲*/private static HashMap<String, SoftReference<Bitmap>> imageCache = null;public Loader() {imageCache = new HashMap<String, SoftReference<Bitmap>>();}public static String getFileName(String url) {return url.substring(url.lastIndexOf(File.separator) + 1);}public static Bitmap getLocalResource(String destDir, String imageName) {Bitmap bmp = null;File imgeDir = new File(destDir);File cache = null;if (!imgeDir.exists()) { // 判断本地缓存目录是否存在imgeDir.mkdirs();} else {cache = new File(destDir + File.separator + imageName); // 判断该图片资源是否存在if (cache.exists()) { // 如果存在就根据图片的存储路径得到Bitmap对象 bmbmp = BitmapFactory.decodeFile(cache.getAbsolutePath());}}return bmp;}public static Bitmap loadBitmap(final ImageView imageView, final String imageURL,final ImageCallBack imageCallBack) {// 在内存缓存中,则返回Bitmap对象if (imageCache.containsKey(imageURL)) {SoftReference<Bitmap> reference = imageCache.get(imageURL);Bitmap bitmap = reference.get();if (bitmap != null) {return bitmap;}} else {/*** 加上一个对本地缓存的查找*/String bitmapName = imageURL.substring(imageURL.lastIndexOf("/") + 1);Bitmap bitmapTemp = null;bitmapTemp = getLocalResource(AppConstant.TEST, bitmapName);if (bitmapTemp != null) {return bitmapTemp;}}final Handler handler = new Handler() {/** (non-Javadoc)* * @see android.os.Handler#handleMessage(android.os.Message)*/@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubimageCallBack.imageLoad(imageView, (Bitmap) msg.obj);}};// 如果不在内存缓存中,也不在本地(被jvm回收掉),则开启线程下载图片new Thread() {/** (non-Javadoc)* * @see java.lang.Thread#run()*/@Overridepublic void run() {// TODO Auto-generated method stubBitmap bitmap = null;try {URL imageUrl = new URL(imageURL);HttpURLConnection conn =  (HttpURLConnection) imageUrl.openConnection();conn.setConnectTimeout(30000);conn.setReadTimeout(30000);conn.setInstanceFollowRedirects(true);// InputStream is = conn.getInputStream();InputStream in = conn.getInputStream();BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = false;options.inSampleSize = 10; // width,hight设为原来的十分一bitmap = BitmapFactory.decodeStream(in, null, options);} catch (MalformedURLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}imageCache.put(imageURL, new SoftReference<Bitmap>(bitmap));Message msg = handler.obtainMessage(0, bitmap);handler.sendMessage(msg);File dir = new File(AppConstant.TEST);if (!dir.exists()) {dir.mkdirs();}File bitmapFile = new File(AppConstant.TEST + File.separator+ imageURL.substring(imageURL.lastIndexOf("/") + 1));if (!bitmapFile.exists()) {try {bitmapFile.createNewFile();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}FileOutputStream fos;try {fos = new FileOutputStream(bitmapFile);bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);fos.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}.start();return null;}/*** 回调接口* * @author onerain* */public interface ImageCallBack {public void imageLoad(ImageView imageView, Bitmap bitmap);}}

坐等大神支招啊
每次都进了setimagebitmap这一步 就是加载不出图片

============解决方案1============

你用imageLoader这个三方开源库试试。

============解决方案2============

看一下你imageview控件设的是src还是background。或者试试把bitmap转成drawable,再setbackground试试

============解决方案3============

看下getView方法?

============解决方案4============

贴下Adapter的代码看看呗

============解决方案5============

你试试AsyncImage这个第三方开源库

============解决方案6============

ImageView imageViewByTag = (ImageView) listview 
                                .findViewWithTag(imageUrl);

问题应该在这一句 你这个搜索 只会找到第一个TAG 是imageUrl的控件。 可能并不是你的要更新的控件。

比如  你setTAG了  , listView 会重用item的,   在 msg.getOPImageList().size()=0 时候 还是有这个tag。  
然后你find的结果就是这个contentView里面的,不是你要更新的那个ImageView。

============解决方案7============

引用

Image_url = new StringBuffer(AppConstant.DOWNLOAD_IMAGE_URL)
.append(msg.getOPImageList().get(0).getImageUrl())
.toString();

ImageView imageView = holder.msgImage;
imageView.setTag(Image_url);
Bitmap bitmap = Loader.loadBitmap(imageView, Image_url,
new ImageCallBack() {
@Override
public void imageLoad(ImageView imageView, Bitmap bitmap) {
if (imageView.getTag() != null
&& imageView.getTag().equals(Image_url)) {
imageView.setImageBitmap(bitmap);
}
}
});
Log.e("当前的postion", "" + position);
if (bitmap == null) {
imageView.setImageDrawable(context.getResources().getDrawable(
R.drawable.ic_launcher));
} else {
imageView.setImageBitmap(bitmap);
}

这个代码中  在 ImageCallBack 接口中 吧imageUrl 回传回来,跟imageView.getTag() 进行比较,应该可以解决问题。试试看。

转载于:https://www.cnblogs.com/lengyanyue39/p/4091340.html

android listview 异步加载问题相关推荐

  1. 又优化了一下 Android ListView 异步加载图片

    写这篇文章并不是教大家怎么样用listview异步加载图片,因为这样的文章在网上已经有很多了,比如这位仁兄写的就很好: http://www.iteye.com/topic/685986 我也是因为看 ...

  2. Android ListView异步加载图片乱序问题,原因分析及解决方案

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553 在Android所有系统自带的控件当中,ListView这个控件算是 ...

  3. Android ListView 异步加载图片

    使用ListView.GridView来展示图片是项目中经常遇到的情况,这里使用官方文档的BitmapFun稍作修改实现ListView 异步加载图片效果. 实现原理:给ListView 注册一个 滚 ...

  4. android listview 异步加载图片并防止错位

    网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertVie ...

  5. Android ListView异步加载数据库图片

    需求:从数据库中得到图片的byte数据,编码成png图片,显示到ListView上 这里最大一个问题就是ListView滑动卡的问题,要解决卡,就需要用到异步加载数据库的图片: 原创博客,转载注明出处 ...

  6. Android实现ListView异步加载图片

    转: http://www.iteye.com/topic/685986 ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法 ...

  7. android开发小技巧:实现listview异步加载图片

    2019独角兽企业重金招聘Python工程师标准>>> 针对listview异步加载图片这个问题,麦子学院android开发老师讲了一种非常实用的方法,麦子学院android开发老师 ...

  8. Android实现ListView异步加载图片总结

    参考自http://blog.csdn.net/wanglong0537/article/details/6334005# http://www.cnblogs.com/slider/archive/ ...

  9. Android实现异步加载图片 ListView

    转自:http://www.congci.com/item/android-listview-load-image ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这 ...

最新文章

  1. 第五周周记(国庆第七天)
  2. Linux Named 进程启动、停止脚本
  3. EasyStack华丽亮相OpenStack Days China
  4. 【Android 逆向】应用安装目录 ( Android 应用的默认安装目录 | 查找 Android 应用的安装目录 | 查询当前正在运行的应用包名 | 根据包名查询应用安装路径 )
  5. java list多字段排序_java中list通过多条件排序
  6. 如何设置电脑锁屏时间_电脑如何设置多屏显示?多屏显示的设置方法
  7. nginx rtmp 编码_基于Nginx的媒体服务器技术
  8. Spotlight on oracle 使用
  9. 【 .NET Core 3.0 】框架之二 || 后端项目搭建
  10. LeetCode 2176. 统计数组中相等且可以被整除的数对
  11. bugzilla dbd-mysql_别人写的关于在Windows下安装BugZilla的说明,不错,值得借鉴
  12. TCP/IP入门(3) --传输层
  13. [ActionScript 3.0] AS3.0 对象在一定范围随机显示不重叠
  14. fastjson JSONObject.toJSONString 出现 $ref: $.的解决办法(重复引用)
  15. CodeForces888E Maximum Subsequence(折半枚举+two-pointers)
  16. mysql 快速导入大SQL文件
  17. 100行代码实现最简单的基于FFMPEG+SDL的视频播放器
  18. php+jquery+ajax+json的一个最简单实例
  19. UCI机器学习数据库的Python API介绍
  20. Google排名查询的8个方法

热门文章

  1. intellij连接真实spark集群运行wordcount-Java
  2. python乐观锁和悲观锁
  3. HTTP 与HTTPS的结构
  4. nginx.conf删除与否网页都能访问(nginx没有生效)的问题
  5. 肺癌图片识别相关的资料调研
  6. 线性支持向量机完全理解版
  7. FreeType, FFmpeg, SDL, 图像处理软件, Mac OS X, Objective-C
  8. 【机器学习】次梯度(subgradient)方法
  9. java redis 商品秒杀_redis编写lua脚本实现商品秒杀
  10. ubuntu中忘记root密码的解决方法