Android 从网上下载图片并显示到ListView上

时间:2021-06-24 19:42:14

首先我们要准备好图片的数据,就是一些网站上图片的地址

拿到之后就可以直接来写了

Android 从网上下载图片并显示到ListView上


package com.example.androidnet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;

public class ListViewShowPic extends Activity {

	ListView listView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.show_listview);

		listView = (ListView) findViewById(R.id.lv_show_img);

		MyAdapter adapter = new MyAdapter(this);
		listView.setAdapter(adapter);
		Log.d("logd", "--UI--");
	}

	class MyAdapter extends BaseAdapter {

		/**
		 * 网上的图片url
		 */
		String[] picUrls = new String[] {
				"http://bmob-cdn-1178.b0.upaiyun.com/2016/05/10/3e1acdd6ecdf4dc2aa9abc45be2443db.jpg",
				"http://bmob-cdn-1178.b0.upaiyun.com/2016/05/10/cff4bd31c3934c8388cd5b47d3d34e29.jpg",
				"http://bmob-cdn-1178.b0.upaiyun.com/2016/05/10/4fd9f3557acd4fb28b28af7a89a2ff27.jpg",
				"http://bmob-cdn-1178.b0.upaiyun.com/2016/05/10/7ead2966291e45c4aef8a198f127bd4a.jpg",
				"http://bmob-cdn-1178.b0.upaiyun.com/2016/05/10/245c7655f4de4536a539a559c9434ce4.jpg",
				"http://bmob-cdn-1178.b0.upaiyun.com/2016/05/10/51b047314ca74259839c4e6e666e9c71.jpg",
				"http://bmob-cdn-1178.b0.upaiyun.com/2016/05/10/1a11e2a135bf4bc29fd60831c64f558c.jpg" };
		/**
		 * 名称对应url上的图片名称
		 */
		String[] picNames = new String[] {
				"3e1acdd6ecdf4dc2aa9abc45be2443db.jpg",
				"cff4bd31c3934c8388cd5b47d3d34e29.jpg",
				"4fd9f3557acd4fb28b28af7a89a2ff27.jpg",
				"7ead2966291e45c4aef8a198f127bd4a.jpg",
				"245c7655f4de4536a539a559c9434ce4.jpg",
				"51b047314ca74259839c4e6e666e9c71.jpg",
				"1a11e2a135bf4bc29fd60831c64f558c.jpg" };
		String path = Environment.getExternalStorageDirectory()
				+ "/listviewImg/";// 文件目录

		LayoutInflater layoutInflater;
		Context context;
		File fileDir;

		public MyAdapter(Context context) {
			this.context = context;
			layoutInflater = (LayoutInflater) context
					.getSystemService(Context.LAYOUT_INFLATER_SERVICE);


			/**
			 * 文件目录如果不存在,则创建
			 */
			fileDir = new File(path);
			if (!fileDir.exists()) {
				fileDir.mkdirs();
			}

		}

		@Override
		public int getCount() {
			return picUrls.length;
		}

		@Override
		public Object getItem(int position) {
			return picUrls[position];
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {

			View view = layoutInflater.inflate(R.layout.listview_img, null);

			ImageView imageView = (ImageView) view.findViewById(R.id.img);

			/**
			 * 创建图片文件
			 */
			File file = new File(fileDir, picNames[position]);
			if (!file.exists()) {// 如果本地图片不存在则从网上下载
				downloadPic(picNames[position], picUrls[position]);
			} else {// 图片存在则填充到listview上
				Bitmap bitmap = BitmapFactory
						.decodeFile(file.getAbsolutePath());
				imageView.setImageBitmap(bitmap);
			}
			return view;
		}

		/**
		 * 使用子线程下载图片
		 * 
		 * @param name
		 * @param url
		 */
		private void downloadPic(final String name, final String picurl) {

			new Thread(new Runnable() {

				@Override
				public void run() {

					FileOutputStream fos = null;
					InputStream in = null;

					// 创建文件
					File file = new File(fileDir, name);

					try {

						fos = new FileOutputStream(file);

						URL url = new URL(picurl);

						in = url.openStream();

						int len = -1;
						byte[] b = new byte[1024];
						while ((len = in.read(b)) != -1) {
							fos.write(b, 0, len);
						}

					} catch (MalformedURLException e) {
						e.printStackTrace();
					} catch (IOException e) {
						e.printStackTrace();
					} finally {
						try {
							if (fos != null) {
								fos.close();
							}
							if (in != null) {
								in.close();
							}
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
			}).start();

		}

	}
}


两个布局文件show_listview.xml

<?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"
   >
    
    

    <ListView 
        android:id="@+id/lv_show_img"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        
    </ListView>
</LinearLayout>

listview_img.xml

<?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:gravity="center"
    android:orientation="vertical" >
    
    <ImageView 
        android:id="@+id/img"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:src="@drawable/bgimg"/>

</LinearLayout>

配置权限

<!-- 在SDCard中创建与删除文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!-- 往SDCard写入数据权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />

demo下载:http://download.csdn.net/detail/an_illusion/9516537