不是不起作用,不信你可以在更新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不起作用的更多相关文章

  1. listview前几个item怎么不停加载

    在加载前几个item的时候,listview有个Adapter,里面的getView方法会被调用好几遍.原因可能有两种: 1.listview在布局文件里高度写成了wrap_content <? ...

  2. universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法

    在listview/gridview中使用UIL来display每个item的图片,当图片数量较多需要滑动滚动时会出现卡顿,而且加载过的图片再次上翻后依然会重复加载(显示设置好的加载中图片) 最近在使 ...

  3. Android进阶:ListView性能优化异步加载图片 使滑动效果流畅

    ListView 是一种可以显示一系列项目并能进行滚动显示的 View,每一行的Item可能包含复杂的结构,可能会从网络上获取icon等的一些图标信息,就现在的网络速度要想保持ListView运行的很 ...

  4. [Android Pro] listView和GridView的item设置的高度和宽度不起作用

    referece to : http://blog.csdn.net/beibeixiao/article/details/9032569 1.     在Android开发中会发现,有时listVi ...

  5. Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877) 今天还是给大家带来自定义控件的编写,自定义一个Lis ...

  6. 【转】Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果

    原文网址:http://blog.csdn.net/xiaanming/article/details/17539199 转帖请注明本文出自xiaanming的博客(http://blog.csdn. ...

  7. [转]Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17539199),请尊重他人的辛勤劳动成果,谢谢! 我在上一 ...

  8. android中设置ListView的选中的Item的背景颜色

    ListView中没有默认的选择颜色,只有选择Item后的焦点颜色,鼠标点击时Item有颜色,放开鼠标后颜色也就没有了,要实现放开鼠标后选择项的背景还是有颜色的. 1.配置main.xml <? ...

  9. Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17539199),请尊重他人的辛勤劳动成果,谢谢! 我在上一 ...

随机推荐

  1. 《JavaScript高级程序设计》读书笔记 ---Date 类型

    ECMAScript 中的Date 类型是在早期Java 中的java.util.Date 类基础上构建的.为此,Date类型使用自UTC(Coordinated Universal Time,国际协 ...

  2. hdfs格式化hadoop namenode -format错误

    在对HDFS格式化,执行hadoop namenode -format命令时,出现未知的主机名的问题,异常信息如下所示: [shirdrn@localhost bin]$ hadoop namenod ...

  3. 项目管理-SVN服务器的搭建

    Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上了,下载地址: http:// ...

  4. CodeForces 703B Mishka and trip

    简单题. 先把环上的贡献都计算好.然后再计算每一个$capital$ $city$额外做出的贡献值. 假设$A$城市为$capital$ $city$,那么$A$城市做出的额外贡献:$A$城市左边城市 ...

  5. python websocket学习使用

    前言 今天看了一些资料,记录一下心得. websocket是html5引入的一个新特性,传统的web应用是通过http协议来提供支持,如果要实时同步传输数据,需要轮询,效率低下 websocket是类 ...

  6. 免费数据库(SQLite、Berkeley DB、PostgreSQL、MySQL、Firebird、mSQL、MSDE、DB2 Express-C、Oracle XE)

    SQLite数据库是中小站点CMS的最佳选择 SQLite 是一个类似Access的轻量级数据库系统,但是更小.更快.容量更大,并发更高.为什么说 SQLite 最适合做 CMS (内容管理系统)呢? ...

  7. Java JVM 类的连接与初始化 [ 转载 ]

    Java类的连接与初始化 (及2013阿里初始化笔试题解析)  转自http://www.cnblogs.com/iceAeterNa/p/4876747.html         Java虚拟机通过 ...

  8. 5、通过js代码设置css样式

    1.页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  9. s=a+aa+aaa+aaaa+aa...aaaa

    main(){ int a,n,count=1; long int sn=0,tn=0; cout<<"input a and n:"; cin>>a> ...

  10. ElasticSearch(2)-文档

    上一篇 ES(1) 官网原地址:https://www.elastic.co/guide/en/elasticsearch/reference/1.7/_cluster_health.html ES权 ...