[android] 练习使用ListView(三)
解决OOM和图片乱序问题
package com.android.test; import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL; import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.util.LruCache;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView; public class MainActivity extends Activity {
private ListView lv_images; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv_images = (ListView) findViewById(R.id.lv_images); ImageLoaderConfiguration configuration=ImageLoaderConfiguration.createDefault(this);
ImageLoader.getInstance().init(configuration); ListAdapter adapter = new ImageAdapter();
lv_images.setAdapter(adapter);
}
/**
* 适配器
* @author taoshihan
*
*/
class ImageAdapter extends BaseAdapter {
private ListView mListView;
private LruCache<String, BitmapDrawable> mImageCache;
public ImageAdapter() {
int maxSize=(int) (Runtime.getRuntime().maxMemory()/1024)/8;
mImageCache=new LruCache<String, BitmapDrawable>(maxSize){
protected int sizeOf(String key, BitmapDrawable drawable) {
return drawable.getBitmap().getByteCount()/1024;
};
};
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//第三个参数就是ListView
if(mListView==null){
mListView=(ListView) parent;
} String url=(String) getItem(position);
View view;
if(convertView!=null){
view=convertView;
}else{
view=View.inflate(getApplicationContext(), R.layout.image_item, null);
}
ImageView imageView=(ImageView) view.findViewById(R.id.tv_image);
//给ImageView设置标签
imageView.setTag(url);
BitmapDrawable bitmapDrawable=getBitmapFromMemoryCache(url);
if(bitmapDrawable!=null){
//读取缓存图片
imageView.setImageDrawable(bitmapDrawable);
}else{
//读取网络图片
ImageWorkerTask task=new ImageWorkerTask(mListView,url);
task.execute(url);
}
return view;
}
/**
* 从缓存中读取图片
* @param key
* @return
*/
public BitmapDrawable getBitmapFromMemoryCache(String key) {
if(mImageCache.get(key)!=null){
return mImageCache.get(key);
}
return null;
}
public void addBitmapToMemoryCache(String key,BitmapDrawable drawable){
if(getBitmapFromMemoryCache(key)==null){
mImageCache.put(key, drawable);
}
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return Images.IMAGE_URLS.length;
} @Override
public Object getItem(int position) {
return Images.IMAGE_URLS[position];
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
/**
* 异步任务
* @author taoshihan
*
*/
class ImageWorkerTask extends AsyncTask<String, Void, BitmapDrawable>{
private ImageView imageView;
public ImageWorkerTask(ListView parent,String imageUrl) {
//在ListView中通过标签找到ImageView控件
this.imageView=(ImageView) parent.findViewWithTag(imageUrl);
}
@Override
protected BitmapDrawable doInBackground(String... params) {
String imageUrl=params[0];
Bitmap bitmap=downLoadBitmap(imageUrl);
BitmapDrawable drawable=new BitmapDrawable(getApplicationContext().getResources(),bitmap);
addBitmapToMemoryCache(imageUrl, drawable);
return drawable;
}
//下载图片
private Bitmap downLoadBitmap(String imageUrl) {
Bitmap bitmap=null;
try {
URL url=new URL(imageUrl);
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
conn.setConnectTimeout(10000);
InputStream is=conn.getInputStream();
bitmap=BitmapFactory.decodeStream(is);
} catch (Exception e) {
}
return bitmap;
}
//下载完成的
@Override
protected void onPostExecute(BitmapDrawable result) {
if(imageView!=null&&result!=null){
imageView.setImageDrawable(result);
}
} } }
static class Images{
public final static String[] IMAGE_URLS = new String[]{
"http://img.my.csdn.net/uploads/201508/05/1438760758_3497.jpg",
"http://img.my.csdn.net/uploads/201508/05/1438760758_6667.jpg",
"http://img.my.csdn.net/uploads/201508/05/1438760757_3588.jpg",
"http://img.my.csdn.net/uploads/201508/05/1438760756_3304.jpg",
"http://img.my.csdn.net/uploads/201508/05/1438760755_6715.jpeg",
"http://img.my.csdn.net/uploads/201508/05/1438760726_5120.jpg",
"http://img.my.csdn.net/uploads/201508/05/1438760726_8364.jpg",
"http://img.my.csdn.net/uploads/201508/05/1438760725_4031.jpg",
"http://img.my.csdn.net/uploads/201508/05/1438760724_9463.jpg",
"http://img.my.csdn.net/uploads/201508/05/1438760724_2371.jpg",
"http://img.my.csdn.net/uploads/201508/05/1438760707_4653.jpg"
};
}
}
[android] 练习使用ListView(三)的更多相关文章
- Android基本控件之listView(三)<用ListView实现分页加载>
我们之前讨论了ListView的基本使用方法和ListView的优化 今天我们再来讨论一个关于ListView的一个新的东西~就是分页加载.那么什么是分页加载呢?简单点说,就是"下拉刷新&q ...
- Android实训案例(三)——实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果!
Android实训案例(三)--实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果! 感叹离春节将至,也同时感叹时间不等人,一年又一年,可是我依然是android道路上的小菜鸟,这篇讲 ...
- Android开发学习——ListView+BaseAdapter的使用
ListView 就是用来显示一行一行的条目的MVC结构 * M:model模型层,要显示的数据 ----people集合 * V:view视图层,用户看到的界面 ...
- Android 如何在 ListView 中更新 ProgressBar 进度
=======================ListView原理============================== Android 的 ListView 的原理打个简单的比喻就是: 演员演 ...
- Android UI组件----ListView列表控件详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- Android UI--自定义ListView(实现下拉刷新+加载更多)
Android UI--自定义ListView(实现下拉刷新+加载更多) 关于实现ListView下拉刷新和加载更多的实现,我想网上一搜就一堆.不过我就没发现比较实用的,要不就是实现起来太复杂,要不就 ...
- 【转】整理一下Android中的ListView
原文网址:http://sunbofu.blog.51cto.com/6431507/1280441 Android中的listview目测是一个使用频率很高的组件,所以今天来总结一下listview ...
- Android SQLite与ListView的简单使用
2017-04-25 初写博客有很多地方都有不足,希望各位大神给点建议. 回归主题,这次简单的给大家介绍一下Android SQLite与ListView的简单使用sqlite在上节中有介绍,所以在这 ...
- [Android] Android RecycleView和ListView 自定义Adapter封装类
在网上查看了很多对应 Android RecycleView和ListView 自定义Adapter封装类 的文章,主要存在几个问题: 一).网上代码一大抄,复制来复制去,大部分都运行不起来,或者 格 ...
- Android开发 ---实现ListView的A-Z字母排序和过滤搜索功能
效果图: 1.activity.xml 描述: 线性布局中一个层叠布局 <?xml version="1.0" encoding="utf-8"?> ...
随机推荐
- 如果使用安卓4.4的SD卡?
安卓4.4默认情况下,后安装的程序无权写入数据到SD卡中,那么是否我们就不能用了?看了很多文章,都说要Root,随后修改配置文件.我觉得这不是很好的方法,Root之后的安卓会有很大风险,这不是最好的办 ...
- linux命令之文件系统管理命令(下)
1.mount:挂载文件系统 该命令可以将指定的文件系统挂载到指定目录(挂载点),在linux中必须先挂载所有的设备,才能够访问,挂载的目录必须事先存在并且最好为空. 参数 说明 -t(常用) 指定挂 ...
- PHP程序执行流程
1, PHP文件一定放在服务器的,但是PHP中不同的内容会在不同的地方执行.下图演示了浏览器请求一个php页面的流程. 2,时序图如下所示,在浏览器中输入url后,首先去本机hosts文件中解析ip地 ...
- 使用git提交代码简单说明
一. 图形化git 1.首先下载msysgit,和 tortoisegit, 先装msysgit再装小乌龟 2.运行git按照github上说明生成秘钥对 ssh-keygen -t rsa ...
- 大数据list去重
MaxList模块主要是对Java集合大数据去重的相关介绍. 背景: 最近在项目中遇到了List集合中的数据要去重,大概一个2500万的数据,开始存储在List中,需要跟一个2万的List去去重. 直 ...
- 为什么int类型的数据可以存储超过9999?
int占4字节,4*8=32位,10进制取值范围为 (-2^31-1)~(2^31-1):-2147483648~2147483647 package test; public class test1 ...
- Laravel一些常用命令整理
自动创建项目 laravel new || laravel new xxx || composer create-project --prefer-dist laravel/laravel blogc ...
- Effective C++ 改善55个方法
美·Scott Meyers 候捷 电子工业 2011 刚才看到个会议时间有点晚,3.25论文都提交了 谷歌去广告的插件, 最后投了这个会议,刚刚好正合适.我说金钱与时间 ACCUSTOMING YO ...
- 剑指offer——链表
#include"stdio.h" #include"stdlib.h" #include"iostream" using namespac ...
- Java_方法的基本语法格式
[修饰符] 返回值类型 方法名称([参数列表]){ 方法体 } [ ]中的内容是可有可无的 暂时将方法的修饰符编写为 public static 返回值类型有两种情况 : 第一种:无返回值类型,也就是 ...