Android简易实战教程--第三十二话《使用Lrucache和NetworkImageView加载图片》
转载本专栏每一篇博客请注明转载出处地址,尊重原创。此博客转载链接地址:小杨的博客 http://blog.csdn.net/qq_32059827/article/details/52791311
本博客是所用vooley框架完成的一个小案例,如果想详细学习该框架的使用。可以关注本人专栏《Android进阶》下的volley框架详解使用。
好了,看到这里说明,你对该框架使用应该算是入门了,那就开始实战之旅吧!
首先,定义一个布局,只用一个ListView就好了了。
然后,自定义一个adapter适配器
package com.leslie.volleylistviewdemo; import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter; import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.Volley; public class MyAdapter extends BaseAdapter {
private String[] list;
private Context context;
private RequestQueue queue;
private ImageLoader imageLoader; public MyAdapter(Context context, String[] list) {
this.context = context;
this.list = list;
queue = Volley.newRequestQueue(context);
imageLoader = new ImageLoader(queue, new MyImageCache());
} @Override
public int getCount() {
return list.length;
} @Override
public Object getItem(int position) {
return list[position];
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null; if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.list_item, null);
holder.img = (NetworkImageView) convertView.findViewById(R.id.userimage); convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
} final String imgUrl = list[position]; if (imgUrl != null && !imgUrl.equals("")) {
holder.img.setDefaultImageResId(R.drawable.ic_launcher);
holder.img.setErrorImageResId(R.drawable.ic_launcher);
holder.img.setImageUrl(imgUrl, imageLoader);
} return convertView;
} class ViewHolder {
NetworkImageView img;
}
}
适配器没什么可说的,主要是在item加载、item数据设置的时候。不再使用ImageView,而是使用了NetworkImageView
item的布局如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <com.android.volley.toolbox.NetworkImageView
android:id="@+id/userimage"
android:layout_width="100dp"
android:layout_height="100dp" /> </LinearLayout>
然后就是它的使用,如果您看过《Android进阶专栏》的volley使用,相信这已经很明了了。
在使用NetworkImageView的时候,需要传入自定义的缓存类对象LruCache:
package com.leslie.volleylistviewdemo; import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache; import com.android.volley.toolbox.ImageLoader.ImageCache; /**
* 自定义一个内存缓存,基于的LRU算法的内存缓存
* @author Administrator
*
*/
@SuppressLint("NewApi") public class MyImageCache implements ImageCache {
LruCache<String, Bitmap> caches;
//1.定义缓存的空间大小
int maxSize = 4 * 1024 * 1024;//单位是byte-->4194304byte // int maxSize = 4;//单位是m-->4M //缓存的最大值 4m 4*1024*1024kb ,是空间大小.不是元素个数 public MyImageCache() {
caches = new LruCache<String, Bitmap>(maxSize) {
//2.重载sizeOf
@Override
protected int sizeOf(String key, Bitmap value) {
// TODO
//返回bitmap这个entry的大小,统一计算单位
// return value.getByteCount() / 1024 / 1024;//一张图片,占了多少M
return value.getByteCount();//一张图片,占了多少bytes
}
};
} /**
* 从缓存里面取图片
*/
@Override
public Bitmap getBitmap(String url) {
System.out.println("--------------从缓存中加载--------------");
return caches.get(url);
} /**
* 放到缓存里面去
*/
@Override
public void putBitmap(String url, Bitmap bitmap) {
System.out.println("--------------放置到缓存--------------");
caches.put(url, bitmap); } }
加载图片和移除缓存图片的时候,我加入了Log。待会再看打印怎么输出的。
最后,看看MainActivity代码:
package com.leslie.volleylistviewdemo; import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView; public class MainActivity extends Activity {
ListView listView;
String[] images = new String[] { "http://192.168.1.100:8080/img/b7003af33a87e950bc07153d12385343fbf2b44b.jpg",
"http://192.168.1.100:8080/img/b7fd5266d01609244a0c6b55d50735fae6cd3457.jpg",
"http://192.168.1.100:8080/img/b86afbbf9f78ae5dddfaa4c72c3afe81.jpg",
"http://192.168.1.100:8080/img/b89230d85178eafa7513a8601ba01d6e.jpg",
"http://192.168.1.100:8080/img/bba1cd11728b4710fc4148cbc1cec3fdfc03234e.jpg",
"http://192.168.1.100:8080/img/bigimg.jpg",
"http://192.168.1.100:8080/img/c0a11a6489b8f14e1f02d0be7afc0cad(1).jpg",
"http://192.168.1.100:8080/img/c0a11a6489b8f14e1f02d0be7afc0cad.jpg",
"http://192.168.1.100:8080/img/c8529ee742fa8abb853b297fef5ad772.jpg",
"http://192.168.1.100:8080/img/c8a9338d3020ea03d66aca22c34cef3f.jpg",
"http://192.168.1.100:8080/img/c9fcc3cec3fdfc03da9554bfd63f8794a5c226c3.jpg",
"http://192.168.1.100:8080/img/ca1349540923dd54489f106fd309b3de9d8248cc.jpg",
"http://192.168.1.100:8080/img/cbdee99ceabdfc7c76a78803c06d3b5b.jpg",
"http://192.168.1.100:8080/img/cdbbf5d62e08e4466fdbd526031145ee.jpg",
"http://192.168.1.100:8080/img/ce9dfc60b7002d583ffd3277def6dec7.jpg",
"http://192.168.1.100:8080/img/d01373f082025aafa359acd3f9edab64034f1aba.jpg",
"http://192.168.1.100:8080/img/d043ad4bd11373f02e541a9ea60f4bfbfbed0443.jpg",
"http://192.168.1.100:8080/img/d1160924ab18972b8bd74acde4cd7b899f510ac3.jpg",
"http://192.168.1.100:8080/img/d439b6003af33a8760a4e74bc45c10385243b592.jpg",
"http://192.168.1.100:8080/img/d6680a5223ac83ab60720d3536b42363.jpg",
"http://192.168.1.100:8080/img/d833c895d143ad4b99b5d1c080025aafa40f0612.jpg",
"http://192.168.1.100:8080/img/db08ab97060da52c484569bf7113d8ea.jpg",
"http://192.168.1.100:8080/img/de2563343fededa0aea0bfe5a040840c.jpg",
"http://192.168.1.100:8080/img/e01491bfc1a6f9fdd273779b582d3f53.jpg",
"http://192.168.1.100:8080/img/e7c04293605ff797a8adbb9369dda2eb.jpg",
"http://192.168.1.100:8080/img/e7cd7b899e510fb36deec090db33c895d0430cc5.jpg",
"http://192.168.1.100:8080/img/eac4b74543a98226e5f5cd768882b9014a90ebaf.jpg",
"http://192.168.1.100:8080/img/f2deb48f8c5494ee7e883e112ff5e0fe99257e0b.jpg",
"http://192.168.1.100:8080/img/f6baf658a81853bcc3b383b1d886d16e.jpg",
"http://192.168.1.100:8080/img/f87228e52049993ea750a79e39f1e3b9.jpg",
"http://192.168.1.100:8080/img/fa7ac7801e26b0a01f99dfeab0e20e6e.jpg",
"http://192.168.1.100:8080/img/fcfaaf51f3deb48f9d86ebd9f21f3a292cf578cd.jpg",
"http://192.168.1.100:8080/img/1000x1500_803068byte.jpg",
"http://192.168.1.100:8080/img/1020x637_312320byte.jpg",
"http://192.168.1.100:8080/img/fda7c901b289af73f4b5e9d9cc21a069.jpg"}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listview);
MyAdapter adapter = new MyAdapter(this, null);
listView.setAdapter(adapter);
}
}
可以把程序跑起来了,如下:(由于服务器崩掉了,暂时使用默认图片吧,见谅)
Android简易实战教程--第三十二话《使用Lrucache和NetworkImageView加载图片》的更多相关文章
- Android简易实战教程--第三十四话《 自定义SeekBar以及里面的一些小知识》
转载本专栏文章,请注明出处尊重原创:博客地址http://blog.csdn.net/qq_32059827/article/details/52849676:小杨的博客 许多应用可能需要加入进度,例 ...
- Android简易实战教程--第三十一话《自定义土司》
最近有点忙,好几天不更新博客了.今天就简单点,完成自定义土司. 主布局文件代码: <RelativeLayout xmlns:android="http://schemas.andro ...
- Android简易实战教程--第四十二话《Spinner下拉级联效果》
本篇承接第四十话第四十话<Spinner> 参考博客:http://blog.csdn.net/yayun0516 进入正题: Strings加入第一级数据: <string-arr ...
- Android简易实战教程--第三十八话《自定义通知NotifiCation》
上一篇小案例,完成了一个普通的通知,点击通知启动了一个活动.但是那里的通知没有加入些"靓点",这一篇就给它加入自定义的布局,完成自定义的通知. 应用:比如QQ音乐为例,当点击音乐播 ...
- Android简易实战教程--第三十六话《电话录音》
今天完成一个简单的电话录音功能,即接通电话后,立即录下自己打电话的声音.实现起来比较简单:一个服务,一个TelephonyManager.一个MediaRecorder就够了. 1.布局提供一个开启录 ...
- Android简易实战教程--第三十五话《音乐播放》
已经好几天不更新博客了,今天轻松一点模拟个简单的"音乐播放器".1分钟看完~ 整个简单布局,加几个控制按钮: <LinearLayout xmlns:android=&quo ...
- Android简易实战教程--第三十话《撕衣美女》
此篇邪恶一些,给单身屌丝发点"福利",通过图片的绘制,给美女脱掉衣服. 原理:图片覆盖图片,通过画笔对顶端的图片做一些特效处理,即手指触摸的地方,设置为透明.即可显示最底部的美女图 ...
- Android简易实战教程--第三十九话《Chronometer实现倒计时》
Android提供了实现按照秒计时的API,今天就是用这个API实现简单的倒计时. 来个布局: <?xml version="1.0" encoding="utf- ...
- Android简易实战教程--第三十九话《简单的模糊查询》
今天这一篇小案例模拟模糊查询,即输入一个字符,显示手机对应的所有存在该字符的路径. 布局: <?xml version="1.0" encoding="utf-8& ...
随机推荐
- LoggerOne
LoggerOne 一个高效.简约.灵活高性能的遵循 PSR-3 的 PHP 日志类库实现. 特性 天然的缓存特性(Logger实例属性),延迟批量写入. 安装&使用 Install $ co ...
- 详解vue移动端 下拉刷新
看完这篇文章,相信大伙也一样可以,做出一个自己的刷新,加载的组件 说这个功能之前,大家要先了解一下,要怎么触发滚动条事件. 一定要注意,所有滚动事件都必须要满足这个条件,横向滚动条也一样, 只要满足子 ...
- 洛谷mNOIP模拟赛Day2-将军令
题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人 ...
- HDU 4501
超市里有n件他想要的商品.小明顺便对这n件商品打了分,表示商品的实际价值.小明发现身上带了v1的人民币,会员卡里面有v2的积分,而且他能免费拿k件.他想知道他最多能买多大价值的商品. 由于小明想要的商 ...
- 【Uva 11280 飞到弗雷德里顿】
·你可以尽情地坐飞机,但停留次数遭到限制. ·英文题,述大意: 给出一张有向图,起点是输入的第一个城市,终点是输入的最后一个城市.给出q个询问,每个询问含一个t,表示 #include&l ...
- 学生管理系统(SSM简易版)总结
之前用 Servlet + JSP 实现了一个简易版的学生管理系统,在学习了 SSM 框架之后,我们来对之前写过的项目重构一下! 技术准备 为了完成这个项目,需要掌握如下技术: Java 基础知识 前 ...
- windows server 2008 R2 禁用ipv6和隧道适配器
在windows server 2008 R2操作系统下部署weblogic web application,部署完成后进行测试,发现测试页的地址使用的是隧道适配器的地址,而不是静态的ip地址,而且所 ...
- selenium登录163邮箱
环境:windows8 python2.7+selenium+chrome 直接上脚本: # coding=utf-8from selenium import webdriverimport tim ...
- python文件转exe
.py文件转exe文件 1.软件说明: 用python写一个视频处理软件,用到的库是moviepy 2.所用软件: Python 3.6.5 32位 pycharm 专门的python编辑ide,推 ...
- .NET中的各种池
在.NET中,常用到的池有四个:字符串拘留池.线程池 .应用程序池.数据库连接池. 字符串拘留池 在.NET中字符串是不可变对象,修改字符串变量的值会产生新的对象.为降低性能消耗及减小程序集大小,.N ...