`
zheyiw
  • 浏览: 1020553 次
  • 性别: 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>
分享到:
评论

相关推荐

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

    本项目“Gallery异步加载图片和listView动态刷新”着重探讨如何优化这两个组件的性能,特别是在处理大量图像时。 Gallery组件是Android提供的一种可以左右滑动浏览的图片展示控件,它允许用户水平滚动查看图片,...

    ListView之+GridView+Gallery图片计时滚动

    在实际开发中,对于ListView和GridView的优化也是必不可少的,例如使用ViewHolder模式提高性能,或者利用AsyncTask进行异步加载以减少UI阻塞。对于Gallery,由于其已被废弃,理解如何用新的组件替换是学习的重点。 ...

    安卓开发-仿网易新闻listview加header图片滚动,上拉下拉刷新.zip.zip

    可以通过使用ViewHolder减少视图查找,异步加载图片以避免阻塞主线程,以及分页加载数据等方式提高性能。 9. **动画效果**:为了提供更好的用户体验,开发者还可以添加过渡动画,比如在数据加载时显示加载指示器,...

    listView上下拉到更新带header头图片轮播

    可以使用异步任务或者`AsyncTask`来处理这些操作,同时使用图片加载库(如Glide或Picasso)来缓存和优化图片显示。 总之,实现"listView上下拉到更新带header头图片轮播"的功能,需要结合Android的基础组件、图片...

    8:Android项目源码-毕业设计源码(168套).rar

    android Gallery实现异步加载网络图片 并只加载当前停止页面图.zip Android ListView下拉刷新 Demo.zip Android SMS 短信内容显示在一个 泡泡 形状的窗口中.zip Android 打包签名 从生成keystore到完成签名.zip ...

    应用源码之Gallery2.zip

    4. **线程管理与异步加载**: - 在Android中,为了保证用户体验,通常会将耗时的操作放在后台线程进行。Gallery2可能会使用AsyncTask或Loader来加载图片,避免阻塞主线程。 - 数据加载和UI更新的同步机制,确保...

    Andorid项目源码(167套)

    android Gallery实现异步加载网络图片 并只加载当前停止页面图.zip Android ListView下拉刷新 Demo.zip Android SMS 短信内容显示在一个 泡泡 形状的窗口中.zip Android 打包签名 从生成keystore到完成签名.zip ...

    android实用案例-开发参考必备

    10. **动态ListView,支持异步更新列表,异步更新图片**:在大量数据的列表中,异步加载和更新数据可以提高用户体验。可能使用了AsyncTask或Loader API来实现后台数据加载,同时结合Universal Image Loader或其他...

    168套Andorid项目源码.zip

    android Gallery实现异步加载网络图片 并只加载当前停止页面图.zip Android ListView下拉刷新 Demo.zip Android sMs 短信内容显示在一个 泡泡 形状的窗口中,zip Android 打包签名 从生成keystore到完成签名,zip ...

    超级强大的工具类下载管理、静默安装、shell工具类等

    例如,下拉刷新与底部加载更多的ListView和ScrollView,这些都是为了处理大数据列表而设计的。下拉刷新常使用SwipeRefreshLayout,底部加载更多通常结合Adapter实现,监听滚动事件,当用户接近列表底部时加载更多...

    Android 开发技巧

    9.74、从GALLERY选取图片 303 9.75、打开录音机 303 9.76、语音朗读 303 9.77、手机获取视频流显示在电脑上 305 9.78、蓝牙的使用 313 9.79、一个很好的加密解密字符串 316 9.80、DRAWABLE、BITMAP、BYTE[]之间的...

Global site tag (gtag.js) - Google Analytics