[android] 练习使用ListView(二)详解手机开发
2023-06-13 09:20:13 时间
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 LruCache String, BitmapDrawable mImageCache;
public ImageAdapter() {
int maxSize=(int) (Runtime.getRuntime().maxMemory()/8);
mImageCache=new LruCache String, BitmapDrawable (maxSize){
protected int sizeOf(String key, BitmapDrawable drawable) {
return drawable.getBitmap().getByteCount();
@Override
public View getView(int position, View convertView, ViewGroup 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);
BitmapDrawable bitmapDrawable=getBitmapFromMemoryCache(url);
if(bitmapDrawable!=null){
//读取缓存图片
imageView.setImageDrawable(bitmapDrawable);
}else{
//读取网络图片
ImageWorkerTask task=new ImageWorkerTask(imageView);
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(ImageView imageView) {
this.imageView=imageView;
@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"
}
5370.html
app程序应用开发手机开发无线开发移动端开发相关文章
- 2022最新手机设备标识码(IMEI、MEID、UDID、UUID、ANDROID_ID、GAID、IDFA等)教程
- 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)
- 【错误记录】Android Studio 编译时 lint 检查报错 ( WARNING: DSL element ‘android.dataBinding.enabled‘ is obsolet )
- Android系统的应用开发与运行环境构建详解手机开发
- Android 低功耗蓝牙的那点事详解手机开发
- 谈谈 23 种设计模式在 Android 项目中的应用详解手机开发
- [android] 手机卫士黑名单功能(短信拦截)详解手机开发
- [android] 隐式意图激活另外一个activity详解手机开发
- [android] 内容提供者实现详解手机开发
- [android] 采用layoutInflater打气筒创建一个view对象详解手机开发
- [android] 采用断点调试的方式观察pull解析的流程详解手机开发
- Android 纵向跑马灯滚动效果详解手机开发
- android仿ios开关按钮详解手机开发
- android之service详解手机开发
- android程序崩溃后重启详解手机开发
- android软件开发之webView.addJavascriptInterface循环渐进【一】详解手机开发
- android-async-http框架源码分析详解手机开发
- android 自定义Lint详解手机开发
- Android逆向工程详解手机开发
- Android动态化框架App Bundles详解手机开发
- Android Activity启动流程分析详解手机开发
- Android Studio 导入项目 出现安装Error:Cause: failed to find target with hash string ‘android-23’ 等错误详解手机开发
- Android 获取联系人和电话号码详解手机开发
- 解锁极致移动体验:Root你的Android手机吧(linuxroot手机)