`
zheyiw
  • 浏览: 996884 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Gallery异步加载图片和listView动态刷新

 
阅读更多
附件为eclipse项目,导入既可运行
主要代码:
类1:
public class InternetGalleryActivity extends Activity implements
		OnClickListener, OnFocusChangeListener {
	private Gallery myGallery;
	InternetGalleryAdapter adapter;
	Button bt, bt2;

	// 只需要关心传入的图片地址
	private String[] imageURL = new String[] {
			"http://www.baidu.com/img/baidu_sylogo1.gif",
			"http://misc.360buyimg.com/lib/img/e/logo.png",
			"http://10.20.30.53:80/pic/cjk.jpg",
			"http://10.20.30.53:80/pic/cjk2.jpg",
			"http://img3.cache.netease.com/www/logo/logo_png.png", };

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		bt = (Button) findViewById(R.id.main_bt);
		bt.setOnClickListener(this);

		bt2 = (Button) findViewById(R.id.main_bt2);
		bt2.setOnClickListener(this);

		myGallery = (Gallery) findViewById(R.id.main_gallery);
		adapter = new InternetGalleryAdapter(this, imageURL);

		myGallery.setAdapter(adapter);

		// 当焦点发生改变时加载后面的图片
		myGallery.setOnFocusChangeListener(this);

	}

	/**
	 * 刷新相簿
	 */
	public void updateGallery() {
		if (null != adapter) {
			Log.d("lg", "notifyDataSetChanged");
			adapter.notifyDataSetChanged();
		}
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.main_bt:
			updateGallery();
			break;
		case R.id.main_bt2:
			// 异步listView加载
			Intent intent = new Intent();
			intent.setClass(this, ListViewLoadActivity.class);
			startActivity(intent);
			break;
		}
	}

	@Override
	public void onFocusChange(View v, boolean hasFocus) {

	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
	}
}

adapter:
public class InternetGalleryAdapter extends BaseAdapter {
	private Context context;
	private String[] imageURL;
	// private int mGalleryItemBackground;
	private Bitmap[] Bitmaps;

	public InternetGalleryAdapter(Context c, String[] imageURL) {
		Log.d("lg", "InternetGalleryAdapter");

		this.context = c;
		this.imageURL = imageURL;
		Bitmaps = new Bitmap[imageURL.length];
		for (int i = 0; i < imageURL.length; i++) {
			Resources res = context.getResources();
			Bitmaps[i] = BitmapFactory.decodeResource(res,
					R.drawable.ic_launcher);
		}

		// TypedArray a = c.obtainStyledAttributes(R.styleable.Gallery);
		/* 取得Gallery属性的Index id */
		// mGalleryItemBackground =
		// a.getResourceId(R.styleable.Gallery_android_galleryItemBackground,
		// 0);
		// 让对象的styleable属性能够反复使用
		// a.recycle();

		PicLoadTask picLoadTask = new PicLoadTask();
		picLoadTask.execute();

	}

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

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

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

	public float getScale(boolean focused, int offset) {
		return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset)));
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		Log.d("lg", "getView");
		ImageView imageView = new ImageView(context);
		imageView.setImageBitmap(Bitmaps[position]);

		imageView.setScaleType(ImageView.ScaleType.FIT_XY);
		imageView.setLayoutParams(new Gallery.LayoutParams(100,
				LayoutParams.FILL_PARENT));
		imageView.setPadding(0, 0, 0, 0);
		// imageView.setBackgroundResource(mGalleryItemBackground);
		return imageView;
	}

	// 很费时的io操作,用异步线程处理
	class PicLoadTask extends AsyncTask<String, Integer, String> {

		// String... 可变长的输入参数,与AsyncTask.exucute()对应
		protected String doInBackground(String... params) {
			// 这里采用一次性全部记载的方法,适合少量图片
			for (int i = 0; i < imageURL.length; i++) {
				try {
					// 从网络获取图片
					URL aryURI = new URL(imageURL[i]);
					URLConnection conn = aryURI.openConnection();
					conn.connect();
					InputStream is = conn.getInputStream();
					Bitmap bm = BitmapFactory.decodeStream(is);
					Bitmaps[i] = bm;
					cwjHandler.post(mUpdateResults); // 发布消息让主线程接收,实现异步线程和主线程的通信
					// notifyDataSetChanged(); //不能直接调用ui操作,这样不是线程安全的
					is.close();
					Thread.sleep(1000); // 模拟延时
				} catch (Exception e) {
					// 处理异常,图片加载失败
					Log.d("lg", e + "");
				}
			}
			return null;
		}

	}

	final Handler cwjHandler = new Handler();

	final Runnable mUpdateResults = new Runnable() {
		public void run() {
			notifyDataSetChanged(); // 不能直接在AsyncTask中调用,因为不是线程安全的
		}
	};
}

类2:listViewLoad
public class ListViewLoadActivity extends ListActivity implements
		OnScrollListener {
	private LinearLayout mLoadLayout;
	private ListView mListView;
	private ListViewAdapter mListViewAdapter = new ListViewAdapter();
	private int mLastItem = 0;
	private int mCount = 41;
	private final Handler mHandler = new Handler();
	private final LayoutParams mProgressBarLayoutParams = new LinearLayout.LayoutParams(
			LinearLayout.LayoutParams.WRAP_CONTENT,
			LinearLayout.LayoutParams.WRAP_CONTENT);
	private final LayoutParams mTipContentLayoutParams = new LinearLayout.LayoutParams(
			LinearLayout.LayoutParams.WRAP_CONTENT,
			LinearLayout.LayoutParams.WRAP_CONTENT);

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		/**
		 * "加载项"布局,此布局被添加到ListView的Footer中。
		 */
		mLoadLayout = new LinearLayout(this);
		mLoadLayout.setMinimumHeight(60);
		mLoadLayout.setGravity(Gravity.CENTER);
		mLoadLayout.setOrientation(LinearLayout.HORIZONTAL);
		/**
		 * 向"加载项"布局中添加一个圆型进度条。
		 */
		ProgressBar mProgressBar = new ProgressBar(this);
		mProgressBar.setPadding(0, 0, 15, 0);
		mLoadLayout.addView(mProgressBar, mProgressBarLayoutParams);
		/**
		 * 向"加载项"布局中添加提示信息。
		 */
		TextView mTipContent = new TextView(this);
		mTipContent.setText("加载中...");
		mLoadLayout.addView(mTipContent, mTipContentLayoutParams);
		/**
		 * 获取ListView组件,并将"加载项"布局添加到ListView组件的Footer中。
		 */
		mListView = getListView();
		mListView.addFooterView(mLoadLayout);
		/**
		 * 组ListView组件设置Adapter,并设置滑动监听事件。
		 */
		setListAdapter(mListViewAdapter);
		mListView.setOnScrollListener(this);
	}

	public void onScroll(AbsListView view, int mFirstVisibleItem,
			int mVisibleItemCount, int mTotalItemCount) {
		mLastItem = mFirstVisibleItem + mVisibleItemCount - 1;
		if (mListViewAdapter.count > mCount) {
			mListView.removeFooterView(mLoadLayout);
		}
	}

	public void onScrollStateChanged(AbsListView view, int mScrollState) {
		/**
		 * 当ListView滑动到最后一条记录时这时,我们会看到已经被添加到ListView的"加载项"布局, 这时应该加载剩余数据。
		 */
		if (mLastItem == mListViewAdapter.count
				&& mScrollState == OnScrollListener.SCROLL_STATE_IDLE) {
			if (mListViewAdapter.count <= mCount) {
				mHandler.postDelayed(new Runnable() {
					@Override
					public void run() {
						mListViewAdapter.count += 10;
						mListViewAdapter.notifyDataSetChanged();
						mListView.setSelection(mLastItem);
					}
				}, 1000);
			}
		}
	}

	class ListViewAdapter extends BaseAdapter {
		int count = 10;

		public int getCount() {
			return count;
		}

		public Object getItem(int position) {
			return position;
		}

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

		public View getView(int position, View view, ViewGroup parent) {
			TextView mTextView;
			if (view == null) {
				mTextView = new TextView(ListViewLoadActivity.this);
			} else {
				mTextView = (TextView) view;
			}
			mTextView.setText("Item " + position);
			mTextView.setTextSize(20f);
			mTextView.setGravity(Gravity.CENTER);
			mTextView.setHeight(60);
			return mTextView;
		}
	}

}

mainlayout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <Gallery
        android:id="@+id/main_gallery"
        android:layout_width="fill_parent"
        android:layout_height="80dp"
        android:background="#55000000"
        android:spacing="1dp" />

    <Button
        android:id="@+id/main_bt"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" >
    </Button>
    
    <Button
        android:id="@+id/main_bt2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" >
    </Button>

</LinearLayout>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics