不是不起作用,不信你可以在更新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. 说说SACC2016第八届架构师大会

    每年这方面的会议很多,不知不觉已经连续举办八年了.一届比一届办的有质量,规模越大.今年也如约而至.2016-10-27在北京万达索菲特酒店.4000多人规模,云集各领域顶尖架构师,运维,云计算,技术专 ...

  2. Haskell 函数式编程

    Haskell是纯函数式编程,它强调不函数不改变外部世界状态,即,一个函数的输出只由函数接收的输入决定.那如何与外面沟通呢,比如读取一个文件内容并输出这个文件内容(字符串),显然这种函数非纯函数,因为 ...

  3. 10.hibernate缓存机制详细分析(转自xiaoluo501395377)

    hibernate缓存机制详细分析   在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论 ...

  4. WildMagic 简单图元(一)

    #include <Wm5WindowApplication3.h> #include <Wm5VisualEffectInstance.h> using namespace ...

  5. PHP文本路径转换为链接文字

    <?php /** * 文本路径转换为有链接的文字 * @param string $str 转换内容 * @return string */ function urlToLink($str) ...

  6. 安装jar包到本地maven仓库

    1.打开cmd 直接输入一下命令 自己下载的jar包放在d盘根目录下,jar名字叫spring-context-support-3.1.0.RELEASE.jar DgroupId后面写的是group ...

  7. C#第八天

    ArrayList ArrayList list=new ArrayList(): list.Add()           //添加单个元素 list.AddRange()   //添加集合元素 l ...

  8. mysql建表设置两个默认CURRENT_TIMESTAMP的技巧

    转载:http://blog.163.com/user_zhaopeng/blog/static/166022708201252323942430/   业务场景: 例如用户表,我们需要建一个字段是创 ...

  9. 请教下关于CKEditor富文本编辑框设置字体颜色的问题

    CKEDITOR.editorConfig = function( config ){ config.plugins = 'about,a11yhelp,basicstyles,bidi,blockq ...

  10. 利用pscp命令实现linux与windows文件互传

    windows==>linux(单个文件) PrivateKey.ppk(私钥)可以是相对路径或者绝对路径pscp -i D:\PrivateKey.ppk D:\xxx.xx root@123 ...