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 : 自定义视图)做到了点击标签自动移动,还差跟下面的 ...
随机推荐
- SimpleHttpServer的学习(1)
闲来没事,分析一下一个简单的HttpServer github地址: https://github.com/Filirom1/SimpleHTTPServer 实现的功能很简单就是一个FTP服务器 默 ...
- Microsoft Azure自动化测试
在使用与微软Azure进行交互的工具并试图衡量性能时,基本上不可能得到任何类似于公平.一致的测试.在午餐时间执行的测试运行会得的一套计时与晚上每个人都离开办公室执行的测试所到的结果可能完全不同.结果取 ...
- sql-逻辑循环while if
--计算1-100的和 declare @int int=1; declare @total int=0; while(@int<=100) begin set @total=@total+@i ...
- [iOS基础控件 - 4.6] iOS开发中的长度单位
对于开发中设置的位置.尺寸单位 系统会根据屏幕的性质转换为像素单位 由于视网膜屏在同样尺寸下分辨率是非视网膜屏的两倍,所以 非视网膜屏:1个单位 = 1像素 视网膜屏:1个单位 = 2像素 应对非 ...
- 转载 SharePoint 2013 Search功能
转载原出处: http://www.cnblogs.com/OceanEyes/p/SharePont-2013-Search-Develop.html 阅读目录 启用Search Service A ...
- 消息队列数量统计(MSMQ,Performance Counter)
微软消息队列服务MSMQ (Microsoft Message Queue),工作在在线或者离线场景,并提供异步编程功能.互联网和企业开发很多场景应用,例如电商的订单处理流程,这是因为客户端不需要等待 ...
- 剑指OFFER之第一个只出现一次的字符(九度OJ1283)
题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字 ...
- java+hadoop+spark+hbase+scala+kafka+zookeeper配置环境变量记录备忘
java+hadoop+spark+hbase+scala 在/etc/profile 下面加上如下环境变量 export JAVA_HOME=/usr/java/jdk1.8.0_102 expor ...
- IOS 图片阴影,圆角等处理
一直以来,为IOS添加图片的特殊效果都是通过跟美工的配合,比如,要加阴影,就从美工那边获得一张阴影效果图,在界面上画两个UIImageView,将阴影放在下面,图像放上上面,错开一定角度.有比如想做圆 ...
- Django中载入js和css文件
Django中载入js和css文件 项目的文件夹结构例如以下: mysite |-mysite |-|-static |-|---js和css文件 |-|-|-init.py |-| |-models ...