Android ListView异步加载数据库图片
需求:从数据库中得到图片的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异步加载数据库图片相关推荐
- 又优化了一下 Android ListView 异步加载图片
写这篇文章并不是教大家怎么样用listview异步加载图片,因为这样的文章在网上已经有很多了,比如这位仁兄写的就很好: http://www.iteye.com/topic/685986 我也是因为看 ...
- Android ListView异步加载图片乱序问题,原因分析及解决方案
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553 在Android所有系统自带的控件当中,ListView这个控件算是 ...
- Android ListView 异步加载图片
使用ListView.GridView来展示图片是项目中经常遇到的情况,这里使用官方文档的BitmapFun稍作修改实现ListView 异步加载图片效果. 实现原理:给ListView 注册一个 滚 ...
- android listview 异步加载图片并防止错位
网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertVie ...
- android listview 异步加载问题
============问题描述============ 学做android,自己想模仿QQ空间做一个小demo listview异步加载图片的时候遇到了一个问题 异步加载用到了SoftReferen ...
- Android实现ListView异步加载图片总结
参考自http://blog.csdn.net/wanglong0537/article/details/6334005# http://www.cnblogs.com/slider/archive/ ...
- Android实现ListView异步加载图片
转: http://www.iteye.com/topic/685986 ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法 ...
- android开发小技巧:实现listview异步加载图片
2019独角兽企业重金招聘Python工程师标准>>> 针对listview异步加载图片这个问题,麦子学院android开发老师讲了一种非常实用的方法,麦子学院android开发老师 ...
- Android之ListView异步加载图片且仅显示可见子项中的图片
折腾了好多天,遇到 N 多让人崩溃无语的问题,不过今天终于有些收获了,这是实验的第一版,有些混乱,下一步进行改造细分,先把代码记录在这儿吧. 网上查了很多资料,发现都千篇一律,抄来抄去,很多细节和完整 ...
最新文章
- 倒序查10条数据_王者荣耀对抗路数据公布,尖端局吕布倒第一,夏洛特真的很意外...
- 用 TensorFlow 目标检测 API 发现皮卡丘!
- PMSM的FOC 矢量控制算法调试流程,新手上手流程
- 手把手maven的功能/安装/使用/idea集成
- mysql 插入优化_MySQL批量SQL插入性能优化
- Binary String Constructing(CF-1003B)
- ann matlab,MatlabANN工具箱实用指南.doc
- java分布式(java入门)
- 线性回归、岭回归、Lasso回归
- 36. In Depth Magento System Configuration
- 华为畅享8plus停产了吗_华为99元起换电池新增27款机型!同时新增一项实用功能...
- matlab 彩色转为黑白,彩色图转为灰度图和黑白图方法
- 只愿得一人心白首不分离
- win10三国志14已停止工作解决方法--win10专业版
- 一个跑步时用的轨迹记录和计步器APP
- CocosCreator中使用Animation制作动画
- 超简单的pyTorch训练-onnx模型-C++ OpenCV DNN推理(附源码地址)
- windows server 2003安装组件提示插入cd
- Matlab Robotic Toolbox安裝
- Camera2架构学习(二)——CameraServer和CameraProvider的启动初始化