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 : 自定义视图)做到了点击标签自动移动,还差跟下面的 ...
随机推荐
- gSoap的 “error LNK2001: 无法解析的外部符号 _namespaces”解决方法
gSoap是C/C++开发webService服务第三方的公开类库. 出现上述错误是因为缺少必要的头文件导致的. 在用wsdl2h生成头文件的时候,一并生成了类似 xx.nsmap 的文件,这个文件实 ...
- STM32学习笔记——FSMC 驱动大容量NAND FLASH [复制链接]
本文原创于观海听涛,原作者版权所有,转载请注明出处. 近几天开发项目需要用到STM32驱动NAND FLASH,但由于开发板例程以及固件库是用于小页(512B),我要用到的FLASH为1G bit的大 ...
- uvalive 3890 Most Distant Point from the Sea
题意:求一个凸多边形中一点到边的最大距离. 思路:转换成在多边形内部,到每边距离为d的直线所围成的内多边形是否存在.也就是,二分距离+半平面交. #include<cstdio> #inc ...
- 在C中定义一个动态的二维数组
一般来讲两种办法: 第一种:连续内存分配 #include "stdio.h" #include "stdlib.h" int main() { int x,y ...
- 数组(Array)
1. 数组(Array):相同类型数据的集合就叫做数组. 2. 数组的定义与赋值(系统会默认初始化) 普通数组: package com.li; public class Array{ public ...
- elecworks 图框管理器
图框管理器中存储的是图纸模板(图框),新建图框的步骤如下: 1 数据库---图框管理器----新建 2 打开图框属性设置窗口,设置图框属性,设置好之后点击确定 3 右击图框图标---打开(进入图框绘制 ...
- TcxVerticalGrid demo
procedure TForm1.Button1Click(Sender: TObject);var row: TcxEditorRow; i,t: Integer;begin grid.ClearR ...
- 好的 ASP.Net网站、博客
1.优秀的个人技术博客 http://www.tracefact.net/Asp-Net/
- ASP.NET中配置应用程序
1. 配置文件简介 1.1 分类 1.2关系 Machine.Config和Web.Config都是设置应用程序的配置信息,它们按照类似于继承的关系对应用程序起作用. Machine.Config ...
- NUMBER_GET_NEXT
1. SNRO /SNUM创建一个流水号对象 CALL FUNCTION 'NUMBER_RANGE_ENQUEUE' EXPORTING OBJECT = '' EXCEPTIONS FOREIGN ...