参考资料: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实现列表界面的列表项中的左侧图标展现之【实现已经加载的列表项的图标上翻的时候不重新加载】的更多相关文章

  1. wxPython制作跑monkey工具(python3)-带显示设备列表界面

    一. wxPython制作跑monkey工具(python3)-带显示设备列表界面  源代码 Run Monkey.py #!/usr/bin/env python import wx import ...

  2. Android UI开发第三十六篇——使用Volley加载图片列表

    Android开发者可能会使用Universal Image Loader或者Square`s newer Picasso这些第三方的库去处理图片的加载,那么Volley是怎么加载图片列表的呢,这一篇 ...

  3. Android 手机卫士--设置界面&功能列表界面跳转逻辑处理

    在<Android 手机卫士--md5加密过程>中已经实现了加密类,这里接着实现手机防盗功能 本文地址:http://www.cnblogs.com/wuyudong/p/5941959. ...

  4. java查看当前项目所有线程列表界面

    java查看当前项目所有线程列表界面 1.TestThread(测试类) package com.isoftstone.pcis.isc.job.king.panel; public class Te ...

  5. TSF自定义候选词列表界面

    概述 TSF(Text Service Framework),已经取代IMM(Input Method Manager),成为win8+系统的输入法框架.现在有个需求,触摸屏上要使用软键盘(虚拟键盘, ...

  6. java查看当前项目所有线程列表界面【转】

    java查看当前项目所有线程列表界面 1.TestThread(测试类) package com.testdemo.pcis.isc.job.king.panel; public class Test ...

  7. Dynamics CRM 客户端程序开发:在实体的列表界面添加按钮

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复114或者20140312可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 如果没有安装Ribbon Wor ...

  8. Vue3学习(七)之 列表界面数据展示

    一.前言 昨晚可能是因为更新完文章后,导致过于兴奋睡不着(写代码确实太容易让人兴奋了),结果两点多才睡着,大东北果然还是太冷了. 不知道是不是因为膝盖和脚都是冰凉的,所以才导致很晚才能入睡? 刚眯了一 ...

  9. React Native :加载新闻列表

    代码地址如下:http://www.demodashi.com/demo/13212.html 标签与内容页联动 上一节(React Native : 自定义视图)做到了点击标签自动移动,还差跟下面的 ...

随机推荐

  1. Algorithm: quick sort implemented in python 算法导论 快速排序

    import random def partition(A, lo, hi): pivot_index = random.randint(lo, hi) pivot = A[pivot_index] ...

  2. DP——最优三角形剖分

    [动态规划]凸多边形最优三角剖分 枚举三角行,再递归三角形旁边的两个多边形.

  3. eclipse下使用tomcat启动maven项目

    最近学习使用maven,建立了一个maven项目使用eclipse下tomcat启动时报错: 严重: ContainerBase.addChild: start: org.apache.catalin ...

  4. Excel里的单元格提行

    最近老板发了个表,遇到了个小知识点,收藏以后有用!拿来学学 如下,是属于单元格.怎么提行? 直接,空格或space,都无法解决!...... 解决办法:Alt + Enter 成功! 参考: http ...

  5. SQL2008--SQL语句-存储过程-触发器-事务处理-基本语法-函数

    环境 SQL2008 1.存储过程建立 库-可编程性-存储过程-右击“存储过程”-点击“新建存储过程” SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCRE ...

  6. 低级错误之Hbm中类型不一致错误

    Myeclipse将数据库中的长整形生成为Bigdecimal类型,实际应该生成为Long.导致保存的时候报错.

  7. express源码剖析2

    当使用express时,代码会这样写: var express = require('express'); 如果创建一个express的应用,代码会这样写: var app = express(); ...

  8. C++学习笔记(十七):RTTI

    这个知识点被遗漏了,可以结合之前的这篇文章看类型转换这个知识点. RTTI(Run-Time Type Information,运行时类型信息)即程序能够使用基类的指针或引用来检查这些指针或引用所指的 ...

  9. ios之runtime学习

    今天学习了一下ios的runtime,看了其他博主的博客写的很不错,自己就不班门弄斧了,仅在此转载: 1.关于oc中类和元类:http://husbandman.diandian.com/post/2 ...

  10. (Relax DFS专题1.2)POJ 2386 Lake Counting(使用DFS来计算有多少坨东西是连通的)

    题目大意:有N*M的矩阵稻田,'W'表示有积水的地方, '.'表示是干旱的地方,问稻田内一共有多少块积水,根据样例很容易得出,积水是8个方向任一方向相连即可. 题目大意:有N*M的矩阵稻田,'W'表示 ...