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

时间: 2024-11-07 02:22:43

volley+NetworkImageView实现列表界面的列表项中的左侧图标展现之【实现已经加载的列表项的图标上翻的时候不重新加载】的相关文章

一个设计项调用另一个设计项的(列表界面支持多选)

//详细说明 例如:[方案管理]设计项上有一个[检查]按钮,点击检查按钮时,调出[用户管理]设计项的列表界面 ,选中调出的[用户管理]设计项列表上的多条记录, 关闭[用户管理]列表时,将选中的记录中的username赋值给[方案管理]设计项所对应的实体中的JianChaRenYuan字段中. 前端sencha.cmd[方案管理]设计项列表上[检查]按钮中的js代码 1 function(button, record, e) 2 { 3 debugger; // 中断调试指令,可以手动删除它 4

iOS简单易用的标签列表界面

iOS简单易用的标签列表界面 Demo效果: Demo演示: 1.使用cocoapods引入YZTagListView,或者直接拖入YZTagListView文件夹到项目中 2.导入YZTagListView.h头文件 1 #import "YZTagList.h" 3.创建YZTagListView控件 1 2 3   YZTagList *tagList = [[YZTagList alloc] init];   tagList.backgroundColor = [UIColor

android仿酷狗歌曲列表界面点击右侧字母定位到该字母的集合列表

原文:android仿酷狗歌曲列表界面点击右侧字母定位到该字母的集合列表 源代码下载地址:http://www.zuidaima.com/share/1550463694064640.htm android仿酷狗歌 曲列表界面 点击右侧字母定位到该字母的集合列表,也像类似联系人界面效果

列表界面上的显示内容的转换

//例如:列表界面上显示的是数字,要将数字转换为文字描述,就用如下的代码: if (value==2) return '审核通过'; else if (value==1) return '已提交,待审核'; else if (value==-1) return '撤销提交,重新编辑'; else if (value==-2) return '未通过,被退回'; else return '编辑中,未提交'; 原文地址:https://www.cnblogs.com/jiaowoyaoshu/p/9

android音乐播放器开发 SweetMusicPlayer 加载歌曲列表

上一篇写了播放器的整体实现思路,http://blog.csdn.net/huweigoodboy/article/details/39855653,现在来总结下加载歌曲列表. 比较好的实现思路就是,自己维护一个SQLite数据库,然后音乐信息都从sd卡上扫描,好处有很多,但是这样做的话代码量会比较大,写了一段扫描sd卡的代码,然后发现扫描音乐的速度简直慢的惊人,可能自己的目录太多,太深,目前还没想到一个比较好的算法去快速扫描sd卡. 楼主比较偷懒,android自己本身有一个关于媒体信息的数据

2.1 如何在列表,字典,集合中根据条件帅选数据

#!/usr/bin/env python # -*- coding:utf-8 -*- #2.1 如何在列表,字典,集合中根据天剑筛选数据 # 帅选列表中符合条件的项 data = [1,5,-3,-2,6,8,0,9] res = [] for x in data: if x >=0: res.append(x) # print(res) #2 from random import randint data = [randint(-10,10) for _ in xrange(10)] m

WP8.1开发中ListView控件加载图列表的简单使用(1)

我也是刚接触WP编程没几个月,就是在这段时间一直闲着没事,然后又比较喜欢WP这款系统,就学习了WP这方面的开发言语,自学是很困难的,掌握这方面的资料不多,很初级,就是自己在网上找资料学习过程中,看到别人的分享让我学到了很多,所以我也想分享一下自己的经验,另一方面也希望和大家交流交流,并得到大家的指点. 好了,不多说了,现在开始进入正题吧: ListView这个控件用的很多,而且功能很强大,在我练习开发两个小软件的之前,我以为很简单没什么内容,谁知在开发过程中,才知道它的功能之多,现在就简单说其中

js循环加载数据列表

js循环加载数据列表 //订单渲染 function buildShowInfoDiv(data){ for(i in data.data){ var bussNo = data.data[i].bussNo; var items='<div class="weui-cells" onclick="selectOneOrder(\''+bussNo+'\')">' items+='<div class="weui-cell"&g

***列表和字典在底层中 谁更快***

字典生成慢,查找快.列表生成快,查找慢.如果是数据多,经常需要查询,务必使用字典. 请看?? 思路: 生成一个很大的文本文件 分别用列表和字典来存储数据,然后读取并搜索数据 考察列表和字典做为数据结构的时候,存储的时间,搜索和访问的时间 计算两种方案的消耗时间 1.创建百万字符文件 我们需要一个较大的文件,来证明我们的猜想!干脆直接生成一个有百万行的字符串乱码文件. 1).产生一串随机字符: 取一些随机的字符,包括数字,字符,标点和符号等等,一共95个随机字符 2).把字符序列,进行随机化分布