下拉刷新图片 缓存等待

51 篇文章 0 订阅



package com.example.listviewrefresh;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {

	// 数据源
	private ArrayList<HashMap<String, Object>> data;
	
	private	String CACHE_URL_KEY="cache_url_key",CACHE_BITMAP="cache_bitmap";
	private ArrayList<HashMap<String, Object>> cache;
	
	private String IMAGE_KEY = "image", TEXT_KEY = "text";

	private ArrayAdapter adapter;

	// 加载这个链接的图片资源
	private String IMAGE_URL = "http://avatar.csdn.net/9/7/A/1_zhangphil.jpg";

	private ListView lv;

	private Activity activity;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		activity = this;

		Resources res = getResources();
		
		cache=new ArrayList<HashMap<String,Object>>();
		

		data = new ArrayList<HashMap<String, Object>>();

		for (int i = 0; i < 20; i++) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put(IMAGE_KEY,
					BitmapFactory.decodeResource(res, R.drawable.ic_launcher));
			map.put(TEXT_KEY, i);

			data.add(map);
		}

		lv = (ListView) findViewById(R.id.listView);
		adapter = new MyAdapter(this, -1);
		lv.setAdapter(adapter);

		lv.setOnScrollListener(new OnScrollListener() {

			private int firstVisibleItem, visibleItemCount, totalItemCount;

			@Override
			public void onScroll(AbsListView view, int firstVisibleItem,
					int visibleItemCount, int totalItemCount) {

				this.firstVisibleItem = firstVisibleItem;
				this.visibleItemCount = visibleItemCount;
				this.totalItemCount = totalItemCount;

				Log.d("", "firstVisibleItem:" + firstVisibleItem
						+ " ,visibleItemCount:" + visibleItemCount
						+ " ,totalItemCount:" + totalItemCount);
			}

			@Override
			public void onScrollStateChanged(AbsListView view, int scrollState) {

				if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
					Log.d("", "SCROLL_STATE_IDLE");

					if (firstVisibleItem == 0) {
						
						Log.d("", "下拉刷新...");
						
						loadNewData(IMAGE_URL);
					}

					boolean b = (firstVisibleItem + visibleItemCount) == totalItemCount;
					if (b) {
						addBottom();
					}
				}
			}
		});
	}
	
	private	void	loadNewData(String url){
		Log.d("检查缓存...",url);
		for(int i=0;i<cache.size();i++){
			HashMap<String,Object> map=cache.get(i);
			String u=map.get(CACHE_URL_KEY)+"";
			if(url.equals(u)){
				Log.d("发现缓存,直接取出来加载!",url);
				Bitmap bmp=(Bitmap) map.get(CACHE_BITMAP);
				
				addTop(bmp);
				
				return;
			}
		}
		
		Log.d("没有发现缓存,开启线程下载",url);
		new AddTopAsyncTask().execute(url);
	}
	
	private class MyAdapter extends ArrayAdapter {

		private LayoutInflater mLayoutInflater;

		public MyAdapter(Context context, int resource) {
			super(context, resource);
			mLayoutInflater = LayoutInflater.from(context);
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if (convertView == null)
				convertView = mLayoutInflater.inflate(R.layout.item, null);

			ImageView image = (ImageView) convertView
					.findViewById(R.id.imageView);
			TextView text = (TextView) convertView.findViewById(R.id.textView);

			HashMap<String, Object> map = getItem(position);

			image.setImageBitmap((Bitmap) map.get(IMAGE_KEY));
			text.setText(map.get(TEXT_KEY) + "");

			return convertView;
		}

		@Override
		public HashMap<String, Object> getItem(int position) {
			return data.get(position);
		}

		@Override
		public int getCount() {
			return data.size();
		}
	}

	private void addTop(Bitmap obj) {
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put(IMAGE_KEY, obj);
		map.put(TEXT_KEY, data.size());

		data.add(0, map);
		adapter.notifyDataSetChanged();
	}

	private class AddTopAsyncTask extends AsyncTask<String,Integer,Bitmap> {

		private ProgressDialog pd;
		
//		private	String url;
//		
//		public	AddTopAsyncTask(String url){
//			this.url=url;
//		}

		@Override
		protected void onPreExecute() {
			pd = new ProgressDialog(activity);
			pd.setMessage("请稍候,正在加载。。。");
			pd.show();
		}

		@Override
		protected Bitmap doInBackground(String... params) {
			String url=params[0];
			
			try {
				byte[] bytes = Utils.loadRawDataFromURL(url);
				Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0,
						bytes.length);
				
				//将加载的数据添加到缓存队列中
				HashMap<String,Object> map=new HashMap<String,Object>();
				map.put(CACHE_URL_KEY, url);
				map.put(CACHE_BITMAP, bmp);
				cache.add(map);
				
				return bmp;
			} catch (Exception e) {
				e.printStackTrace();
			}

			return null;
		}

		// @Override
		// protected void onProgressUpdate(Object... values) {
		// int value = (Integer) values[0];
		// pd.setProgress(value);
		// }

		@Override
		protected void onPostExecute(Bitmap result) {
			pd.dismiss();

			addTop(result);
		}
	}

	// 底部刷新增加数据
	private void addBottom() {
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put(IMAGE_KEY, BitmapFactory.decodeResource(getResources(),
				R.drawable.ic_launcher));
		map.put(TEXT_KEY, data.size());

		data.add(map);
		adapter.notifyDataSetChanged();

		lv.setSelection(ListView.FOCUS_DOWN);
	}
}


package com.example.listviewrefresh;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.util.Log;

public class Utils {

	public static byte[] loadRawDataFromURL(String u) throws Exception {  
		Log.d("下載數據...",u);
		
		
        URL url = new URL(u);  
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  
        InputStream is = conn.getInputStream();  
        BufferedInputStream bis = new BufferedInputStream(is);  
  
        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  
        final int BUFFER_SIZE = 2048;  
        final int EOF = -1;  
  
        int c;  
        byte[] buf = new byte[BUFFER_SIZE];  
  
        while (true) {  
            c = bis.read(buf);  
            if (c == EOF)  
                break;  
  
            baos.write(buf, 0, c);  
        }  
  
        conn.disconnect();  
        is.close();  
  
        byte[] data = baos.toByteArray();  
        baos.flush();  
        
        Log.d("下載數據完畢",u);
  
        return data;  
    }  
	
}

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

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="TextView" />

</LinearLayout>

<uses-permission android:name="android.permission.INTERNET"/>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值