listview前几个item的图片怎么是空白的、listview更新了ui不起作用、在handler里更新了UI不起作用
不是不起作用,不信你可以在更新ui代码附近加输出的log,说明程序是跑到那里了。但是未达到我们的想要的效果。
我们知道在listview里更新UI,listview的适配器Adapter里有个getView方法,在里面通常我们更新UI都是对holder里的控件更新。
代码如下:
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
if (convertView == null) {
convertView = View.inflate(getApplicationContext(),R.layout.list_item, null);
holder = new ViewHolder();
holder.ivImage = (ImageView) convertView.findViewById(R.id.iv_image);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.ivImage.setImageBitmap(bitmap);//更新UI
return convertView;
}
但有时候我们要执行一些耗时操作,比如请求网络下载图片、从sdcard读取并压缩图片,我们就必须得另开子线程去执行。代码如下:
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
if (convertView == null) {
convertView = View.inflate(getApplicationContext(),R.layout.list_item, null);
holder = new ViewHolder();
holder.ivImage = (ImageView) convertView.findViewById(R.id.iv_image);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
bitmap = mMemoryCacheUtils.getMemoryCache(list.get(position));
if (bitmap != null) {
// 从内存获取
holder.ivImage.setImageBitmap(bitmap);// 更新UI
} else {
// 从sdcard获取
new Thread() {
public void run() {
compressBitmap = BitmapUtil.compressPicture(list.get(position), 120, 60);//获取sdcard图片并压缩
if (compressBitmap != null) {
mMemoryCacheUtils.setMemoryCache(list.get(position), compressBitmap);
mHandler.post(new Runnable() {
public void run() {
holder.ivImage.setImageBitmap(compressBitmap);// 更新UI
}
});
}
}
}.start();
return convertView;
}
从上面红色代码处得知,开启了子线程去获取并压缩图片,然后将该图片设置给imageview,而且也是执行在handler里,更新UI应该没问题啊,可是得出的效果图就是前几个item的图片都没有展示出来:

把listview往上滑可以看到后面的图片却可以展示出来。
通过log输出也确实跑到了红色代码那里,但是却没达到理想效果。我当时几近崩溃,抓狂的啊,网上搜索也没有类似问题。后来想了一下,既然代码都跑到这了,为什么更新UI却没反应呢?有可能是更新错了地方了。也正因为咱们新开了子线程,而且执行了耗时操作,那么跑到红色代码那里的时候getView这个方法都走了好几遍了。所以holder里的ivImage也不是当时的item的imageview。所以要找个方法来保存这个imageview。所以代码换成如下的:
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
if (convertView == null) {
convertView = View.inflate(getApplicationContext(), R.layout.list_item, null);
holder = new ViewHolder();
holder.ivImage = (ImageView) convertView.findViewById(R.id.iv_image);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
bitmap = mMemoryCacheUtils.getMemoryCache(list.get(position));
if (bitmap != null) {
// 从内存获取
holder.ivImage.setImageBitmap(bitmap);// 更新UI
} else {
// 若没有的话则开启新线程加载图片
queuePhoto(list.get(position), holder.ivImage); // 设置默认图片
holder.ivImage.setImageResource(R.drawable.ic_launcher);
}
return convertView;
}
private void queuePhoto(String url, ImageView imageView) {
PhotoToLoad p = new PhotoToLoad(url, imageView);//先保存住url和imageview
executorService.submit(new PhotosLoader(p));//然后再开启子线程
}
// Task for the queue
private class PhotoToLoad {
public String url;
public ImageView imageView;
public PhotoToLoad(String u, ImageView i) {
url = u;
imageView = i;
}
}
完整代码可以看LazyAdapter.java
demo(lazylist)代码:https://pan.baidu.com/s/1mhZbaHi
listview前几个item的图片怎么是空白的、listview更新了ui不起作用、在handler里更新了UI不起作用的更多相关文章
- listview前几个item怎么不停加载
在加载前几个item的时候,listview有个Adapter,里面的getView方法会被调用好几遍.原因可能有两种: 1.listview在布局文件里高度写成了wrap_content <? ...
- universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法
在listview/gridview中使用UIL来display每个item的图片,当图片数量较多需要滑动滚动时会出现卡顿,而且加载过的图片再次上翻后依然会重复加载(显示设置好的加载中图片) 最近在使 ...
- Android进阶:ListView性能优化异步加载图片 使滑动效果流畅
ListView 是一种可以显示一系列项目并能进行滚动显示的 View,每一行的Item可能包含复杂的结构,可能会从网络上获取icon等的一些图标信息,就现在的网络速度要想保持ListView运行的很 ...
- [Android Pro] listView和GridView的item设置的高度和宽度不起作用
referece to : http://blog.csdn.net/beibeixiao/article/details/9032569 1. 在Android开发中会发现,有时listVi ...
- Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果
本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877) 今天还是给大家带来自定义控件的编写,自定义一个Lis ...
- 【转】Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
原文网址:http://blog.csdn.net/xiaanming/article/details/17539199 转帖请注明本文出自xiaanming的博客(http://blog.csdn. ...
- [转]Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17539199),请尊重他人的辛勤劳动成果,谢谢! 我在上一 ...
- android中设置ListView的选中的Item的背景颜色
ListView中没有默认的选择颜色,只有选择Item后的焦点颜色,鼠标点击时Item有颜色,放开鼠标后颜色也就没有了,要实现放开鼠标后选择项的背景还是有颜色的. 1.配置main.xml <? ...
- Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17539199),请尊重他人的辛勤劳动成果,谢谢! 我在上一 ...
随机推荐
- sql 针对拼接语句的优化
在日常的开发中尽量少采用拼接语句,但针对多条件联合查询,并有多字段可以偏序的情况下,的确采用拼接语句要方便简单得多,单数据库会因为传入的参数不同而产生不同的计划数,计划数多了,对数据库影响很大. 为了 ...
- Hive中频繁报警的问题
在使用Hive的过程中,是不是会在shell中报一堆警告,虽然说不影响正常使用,但是看着很烦人,而且指不定会影响数据的准确性和运行的稳定性. 警告的内容如下: Tue Aug :: CST WARN: ...
- HDU 5863 cjj's string game
$dp$,矩阵加速. 设$dp[i][j][0]$表示:长度为$i$的两个字符串,之前还未出现过长度为$m$相同的,目前为止最后$j$个是相同的. 设$dp[i][j][1]$表示:长度为$i$的两个 ...
- SQL learning
一.创建和删除数据库 1.创建用户 //创建用户且置密码,在MySQL中行,但在Oracle中行 ----必须在超级管理员身份下操作 create user hncu identified by ' ...
- css--多重样式
1.一个DIV中既有class又有id <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...
- Velocity China 2016 Web 性能与运维大会:构建快速、可扩展的弹性网站
Velocity China 2016 Web 性能与运维大会是一场关于构建快速.可扩展的弹性网站所需要的Web性能.运维及开发运维的训练.大会将于2016年12月1日在北京拉开帷幕,此次大会被众多业 ...
- HDU3791二叉搜索树(二叉树)
Problem Description 判断两序列是否为同一二叉搜索树序列 Input 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束.接下去一行是一 ...
- yii中数据模型的使用
模型是 CModel 或其子类的实例.模型用于保持数据以及与其相关的业务逻辑. 模型是单独的数据对象.它可以是数据表中的一行,或者一个用户输入的表单. yii数据库操作使用的是PDO,所以使用yii的 ...
- Spring的Bean之Bean的基本概念[转]
从前面我们知道Spring其实就是一个大型的工厂,而Spring容器中的Bean就是该工厂的产品.对于Spring容器能够生产那些产品,则取决于配置文件中配置. 对于我们而言,我们使用Spring框架 ...
- 四、WCF的配置文件
注:本文为学习摘抄,原文地址:http://www.cnblogs.com/iamlilinfeng/archive/2012/10/02/2710224.html 一.概述 配置也是WCF编程中的主 ...