Gallery异步加载图片和listView动态刷新
来源:互联网 发布:c语言int main void 编辑:程序博客网 时间:2024/05/22 20:07
- 类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>