volley+NetworkImageView实现列表界面的列表项中的左侧图标展现之【实现已经加载的列表项的图标上翻的时候不重新加载】
参考资料:http://blog.csdn.net/guolin_blog/article/details/17482165
我使用的列表的适配器是继承ArrayAdapter的,所以关于使用volley+NetworkImageView获取图标资源,是在getView中执行的。
/**列表的适配器:继承ArrayAdapter*/
public class NewsListArrayAdapter extends ArrayAdapter<CnBlogsNews>{ private static final String TAG = "NewsListArrayAdapter"; private int listItemResourceId; private Context thisContext; private LruCache<String, Bitmap> mMemoryCache;//必须设置为全局变量,而不是写在BitmapCache类中,同样,实例化也必须写在构造函数中 public NewsListArrayAdapter(Context context, int resource,
List<CnBlogsNews> objects) {
super(context, resource, objects); listItemResourceId = resource; thisContext = context; initLruCache();//改进后的BitmapCache构造函数
} /*改进后的BitmapCache构造函数*/
private void initLruCache(){ // 获取到可用内存的最大值,使用内存超出这个值会引起OutOfMemory异常
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);//以字节为单位,除以1024就是KB为单位
Log.v(TAG, "maxMemory="+maxMemory+"KB");//196608KB == 192M int maxSize = 1 * 1024 * 1024; // LruCache通过构造函数传入缓存值,以KB为单位 mMemoryCache = new LruCache<String, Bitmap>(maxSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
// 重写此方法来衡量每张图片的大小,默认返回图片数量。
Log.v(TAG, "bitmap.getRowBytes() * bitmap.getHeight()="+bitmap.getRowBytes() * bitmap.getHeight());
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
} @Override
public View getView(int position, View convertView, ViewGroup parent) { final CnBlogsNews cnblogsNews = getItem(position); View view = null;
ViewHolder holder; if(convertView == null){ view = LayoutInflater.from(thisContext).inflate(listItemResourceId, parent, false); holder = new ViewHolder();
holder.newslist_topicIcon = (NetworkImageView) view.findViewById(R.id.newslist_topicIcon);
holder.newslist_title = (TextView) view.findViewById(R.id.newslist_title);
holder.newslist_Published = (TextView) view.findViewById(R.id.newslist_Published); view.setTag(holder); }else{
view = convertView;
holder = (ViewHolder) view.getTag();
} //加载图标资源
loadImageViewWithUrl(holder.newslist_topicIcon,cnblogsNews.getNewsTopicIconUrl()); holder.newslist_title.setText(cnblogsNews.getNewsTitle());
holder.newslist_Published.setText(cnblogsNews.getNewsPublished()+":序号="+position); //添加链接地址,通过webView方式打开
view.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
WebViewActivity.openWebViewActivity(thisContext, cnblogsNews.getNewsLink()); }
}); return view;
} class ViewHolder{
NetworkImageView newslist_topicIcon;//新闻主题图片
TextView newslist_title;//新闻标题
TextView newslist_Published;//新闻发布时间
} //根据URL地址加载图片 /*
* 1. 创建一个RequestQueue对象。
* 2. 创建一个ImageLoader对象。
* 3. 获取一个ImageListener对象。
* 4. 调用ImageLoader的get()方法加载网络上的图片。
* */
private void loadImageViewWithUrl(NetworkImageView imgView , String urlStr){ RequestQueue requestQueue = Volley.newRequestQueue(thisContext);
//实现缓存功能
ImageLoader imgLoader = new ImageLoader(requestQueue,new BitmapCache()); //ImageListener imgListener = ImageLoader.getImageListener(imgView, R.drawable.ic_empty, R.drawable.ic_error);
//imgLoader.get(urlStr, imgListener); imgView.setDefaultImageResId(R.drawable.ic_empty);
imgView.setErrorImageResId(R.drawable.ic_error); imgView.setImageUrl(urlStr, imgLoader); } //将缓存图片的大小设置为10M==改进后的
private class BitmapCache implements ImageCache { @Override
public Bitmap getBitmap(String url) {
Log.v(TAG, "getBitmap==url=="+url);
return mMemoryCache.get(url);
} @Override
public void putBitmap(String url, Bitmap bitmap) {
Log.v(TAG, "putBitmap==url=="+url); if (mMemoryCache.get(url) == null) {
mMemoryCache.put(url, bitmap);
} } } }
NewsListArrayAdapter
关键在于:不在BitmapCache类中实例化LruCache类,而是将LruCache类赋值为全局变量,这样就保证了整个列表的所有项的图标使用的是同一个LruCache。
如果在BitmapCache类中实例化LruCache的话(代码如下),下翻页后再重新回到上一页的时候,会发现图标重新在加载。
public class BitmapCache implements ImageCache {
private LruCache<String, Bitmap> mCache;
public BitmapCache() {
int maxSize = 10 * 1024 * 1024;
mCache = new LruCache<String, Bitmap>(maxSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap);
}
}
BitmapCache
volley+NetworkImageView实现列表界面的列表项中的左侧图标展现之【实现已经加载的列表项的图标上翻的时候不重新加载】的更多相关文章
- wxPython制作跑monkey工具(python3)-带显示设备列表界面
一. wxPython制作跑monkey工具(python3)-带显示设备列表界面 源代码 Run Monkey.py #!/usr/bin/env python import wx import ...
- Android UI开发第三十六篇——使用Volley加载图片列表
Android开发者可能会使用Universal Image Loader或者Square`s newer Picasso这些第三方的库去处理图片的加载,那么Volley是怎么加载图片列表的呢,这一篇 ...
- Android 手机卫士--设置界面&功能列表界面跳转逻辑处理
在<Android 手机卫士--md5加密过程>中已经实现了加密类,这里接着实现手机防盗功能 本文地址:http://www.cnblogs.com/wuyudong/p/5941959. ...
- java查看当前项目所有线程列表界面
java查看当前项目所有线程列表界面 1.TestThread(测试类) package com.isoftstone.pcis.isc.job.king.panel; public class Te ...
- TSF自定义候选词列表界面
概述 TSF(Text Service Framework),已经取代IMM(Input Method Manager),成为win8+系统的输入法框架.现在有个需求,触摸屏上要使用软键盘(虚拟键盘, ...
- java查看当前项目所有线程列表界面【转】
java查看当前项目所有线程列表界面 1.TestThread(测试类) package com.testdemo.pcis.isc.job.king.panel; public class Test ...
- Dynamics CRM 客户端程序开发:在实体的列表界面添加按钮
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复114或者20140312可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 如果没有安装Ribbon Wor ...
- Vue3学习(七)之 列表界面数据展示
一.前言 昨晚可能是因为更新完文章后,导致过于兴奋睡不着(写代码确实太容易让人兴奋了),结果两点多才睡着,大东北果然还是太冷了. 不知道是不是因为膝盖和脚都是冰凉的,所以才导致很晚才能入睡? 刚眯了一 ...
- React Native :加载新闻列表
代码地址如下:http://www.demodashi.com/demo/13212.html 标签与内容页联动 上一节(React Native : 自定义视图)做到了点击标签自动移动,还差跟下面的 ...
随机推荐
- 题目1043:Day of Week(输入日期与当前日起天数差%7,在做相关星期调整)
题目描述: We now use the Gregorian style of dating in Russia. The leap years are years with number divis ...
- Crash的旅行计划
除草了.. Crash的旅行计划 [问题描述] 过不了多久,Crash就要迎来他朝思暮想的暑假.在这个暑假里,他计划着到火星上旅游.在火星上有N个旅游景点,Crash用1至N这N个正整数对这些景点标号 ...
- HDU-4648 Magic Pen 6 简单题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4648 求遍前缀和,然后扫描标记下就可以了... //STATUS:C++_AC_453MS_1792K ...
- jqgrid单元格设置空值的方法
项目中使用jqgrid,在使用的场景下经常需要清空单元格内容,于是使用了下面的代码: $("#jqgrid1").jqGrid('setCell',rowId, 'column', ...
- A Tour of Go Methods with pointer receivers
Methods can be associated with a named type or a pointer to a named type. We just saw two Abs method ...
- 1000万条数据导入mysql
今天需要将一个含有1000万条数据的文本内容插入到数据库表中,最初自然想到的是使用Insertinto '表名'values(),(),()...这种插入方式,但是发现这种方式对1000万条数据量的情 ...
- iOS 正则表达式小结
#pragma mark - 正则第一种表示方式-利用NSPredicate(谓词)匹配// NSString *email = @"15078357696@163.com" ...
- window 便笺
windows的便签很方便人们记录日常工作安排,但是不是所有人都知道如何调用,下面介绍下如何调用windows便签: 1.win + R --> StikyNot 2.弹出便签界面 3.右击底 ...
- MySQL通过RPM安装
以前写过一篇文章,RedHat Linux 6.1 安装MySQL,本文是从解决依赖的角度上再次描述如何在Linux下以RPM包方式安装MySQL. [root@serv01 ~]# ls /iso/ ...
- iis启动网站提示 文件正在使用
通常是端口被占用,使用netstat -ano,查看占用的进程pid,结束