需求:从数据库中得到图片的byte数据,编码成png图片,显示到ListView上

这里最大一个问题就是ListView滑动卡的问题,要解决卡,就需要用到异步加载数据库的图片;

原创博客,转载注明出处:http://blog.csdn.net/deng0zhaotai/article/details/50596332

程序第一次启动时会把assets中的数据库压缩文件复制到/data/data/packageName.../databases/目录下,这里使用的是网上找的一个工具类,详细代码可以在下面的链接下载,异步操作主要是在Adapter的getView()函数中处理,如果已经添加到缓存就直接取,否则会开启task去加载,下面看下ImageAdapter的详细代码,都有添加注释,应该不难理解

package com.dzt.listviewshow;import java.util.List;import com.dzt.listviewshow.AsyncImageLoader.OnLoadFinishListener;
import com.dzt.listviewshow.utils.LogUtils;import android.content.Context;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;public class ImageAdapter extends BaseAdapter {private Context context;private List<CarClass> carClass;private LayoutInflater mInflater;private LruCache<String, Bitmap> mMemoryCache;public ImageAdapter(Context context, List<CarClass> carClass) {this.context = context;this.carClass = carClass;mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);// LruCache通过构造函数传入缓存值,以KB为单位。int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);// 使用最大可用内存值的1/8作为缓存的大小。int cacheSize = maxMemory / 8;mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {@Overrideprotected int sizeOf(String key, Bitmap bitmap) {// 重写此方法来衡量每张图片的大小,默认返回图片数量。return bitmap.getByteCount() / 1024;}};}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn carClass.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn carClass.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stub// 1获取item,再得到控件// 2 获取数据// 3绑定数据到itemViewHolder hodler = null;CarClass cc = carClass.get(position);if (convertView == null) {convertView = mInflater.inflate(R.layout.item, null);hodler = new ViewHolder();hodler.tvView = (TextView) convertView.findViewById(R.id.tv_title);hodler.ivView = (ImageView) convertView.findViewById(R.id.iv_img);convertView.setTag(hodler);} else {hodler = (ViewHolder) convertView.getTag();}hodler.ivView.setTag(cc.index);final Bitmap bitmap = getBitmapFromMemCache("" + cc.index);if (bitmap == null) {LogUtils.i("getView-----bitmap == null");hodler.ivView.setImageResource(R.drawable.carback);// 异步的加载图片 (线程池 + Handler ) ---> AsyncTaskasyncloadImage(hodler.ivView, cc);} else {LogUtils.i("getView-----bitmap != null");hodler.ivView.setImageBitmap(bitmap);}hodler.tvView.setText("第 " + position + " 个 " + cc.carClass);return convertView;}private void asyncloadImage(ImageView iv_header, CarClass cc) {AsyncImageLoader task = new AsyncImageLoader(context, iv_header,cc.index, new LoadFinish());task.execute(cc.bitmap);}class ViewHolder {ImageView ivView;TextView tvView;}public void addBitmapToMemoryCache(String key, Bitmap bitmap) {if (getBitmapFromMemCache(key) == null) {mMemoryCache.put(key, bitmap);}}public Bitmap getBitmapFromMemCache(String key) {return mMemoryCache.get(key);}class LoadFinish implements OnLoadFinishListener {@Overridepublic void onLoadFinish(Bitmap bitmap, int index) {// TODO Auto-generated method stubLogUtils.i("onLoadFinish-----index = " + index);addBitmapToMemoryCache(String.valueOf(index), bitmap);}}
}

为了防止滑动过快时错位显示,需要在getview函数为ImageView加上hodler.ivView.setTag(cc.index);,在异步加载时根据Tag是否显示

package com.dzt.listviewshow;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.ImageView;public class AsyncImageLoader extends AsyncTask<byte[], Void, Bitmap> {private Context mContext;private ImageView image;private int mIndex;private OnLoadFinishListener mListener;/*** 构造方法,需要把ImageView控件和LruCache 对象传进来* * @param image*            加载图片到此 {@code}TextView* @param lruCache*            缓存图片的对象*/public AsyncImageLoader(Context context, ImageView image, int index,OnLoadFinishListener listener) {mContext = context;this.image = image;mIndex = index;mListener = listener;}@Overrideprotected Bitmap doInBackground(byte[]... params) {// TODO Auto-generated method stubreturn getBitmap(params[0]);}@Overrideprotected void onPostExecute(Bitmap bitmap) {int inx = (int) image.getTag();if (mIndex == inx) {image.setImageBitmap(bitmap);if (mListener != null) {mListener.onLoadFinish(bitmap, mIndex);}}}// 解析图片private Bitmap getBitmap(byte[] icon) {return BitmapFactory.decodeByteArray(icon, 0, icon.length);}interface OnLoadFinishListener {public void onLoadFinish(Bitmap bitmap, int index);}
}

关键代码:

int inx = (int) image.getTag();
if (mIndex == inx) {
image.setImageBitmap(bitmap);
if (mListener != null) {
mListener.onLoadFinish(bitmap, mIndex);
}
}
本文可以学习到异步加载图片、防止item显示错位、图片缓存、解压压缩文件

代码下载链接:http://pan.baidu.com/s/1qXuwilu

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 异步加载问题

    ============问题描述============ 学做android,自己想模仿QQ空间做一个小demo listview异步加载图片的时候遇到了一个问题 异步加载用到了SoftReferen ...

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

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

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

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

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

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

  9. Android之ListView异步加载图片且仅显示可见子项中的图片

    折腾了好多天,遇到 N 多让人崩溃无语的问题,不过今天终于有些收获了,这是实验的第一版,有些混乱,下一步进行改造细分,先把代码记录在这儿吧. 网上查了很多资料,发现都千篇一律,抄来抄去,很多细节和完整 ...

最新文章

  1. 倒序查10条数据_王者荣耀对抗路数据公布,尖端局吕布倒第一,夏洛特真的很意外...
  2. 用 TensorFlow 目标检测 API 发现皮卡丘!
  3. PMSM的FOC 矢量控制算法调试流程,新手上手流程
  4. 手把手maven的功能/安装/使用/idea集成
  5. mysql 插入优化_MySQL批量SQL插入性能优化
  6. Binary String Constructing(CF-1003B)
  7. ann matlab,MatlabANN工具箱实用指南.doc
  8. java分布式(java入门)
  9. 线性回归、岭回归、Lasso回归
  10. 36. In Depth Magento System Configuration
  11. 华为畅享8plus停产了吗_华为99元起换电池新增27款机型!同时新增一项实用功能...
  12. matlab 彩色转为黑白,彩色图转为灰度图和黑白图方法
  13. 只愿得一人心白首不分离
  14. win10三国志14已停止工作解决方法--win10专业版
  15. 一个跑步时用的轨迹记录和计步器APP
  16. CocosCreator中使用Animation制作动画
  17. 超简单的pyTorch训练-onnx模型-C++ OpenCV DNN推理(附源码地址)
  18. windows server 2003安装组件提示插入cd
  19. Matlab Robotic Toolbox安裝
  20. Camera2架构学习(二)——CameraServer和CameraProvider的启动初始化

热门文章

  1. Linux alias所有用户 当前用户
  2. Android复习指南
  3. 交强险 法律是人大制定的 法院依据法律来审判 政府可以依据法律制定法规、条例等
  4. 股价遭遇二级市场“回收”,爱回收距离万物新生有多远?
  5. 如何运营一个B2B2C电商网站
  6. 盒子四周加上阴影css
  7. echarts 不连续的两点之间连线
  8. if语句boolean类型判断
  9. 自动化测试面试题(一)
  10. 人工智能学习07--pytorch11--分类网络:使用pytorch和tensorflow计算分类模型的混淆矩阵