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

来源:互联网 发布:c语言int main void 编辑:程序博客网 时间:2024/05/22 20:07
  1. 类1:
  2. public class InternetGalleryActivity extends Activity implements
  3.                 OnClickListener, OnFocusChangeListener {
  4.         private Gallery myGallery;
  5.         InternetGalleryAdapter adapter;
  6.         Button bt, bt2;

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

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

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

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

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

  24.                 myGallery.setAdapter(adapter);

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

  27.         }

  28.         /**
  29.          * 刷新相簿
  30.          */
  31.         public void updateGallery() {
  32.                 if (null != adapter) {
  33.                         Log.d("lg", "notifyDataSetChanged");
  34.                         adapter.notifyDataSetChanged();
  35.                 }
  36.         }

  37.         @Override
  38.         public void onClick(View v) {
  39.                 switch (v.getId()) {
  40.                 case R.id.main_bt:
  41.                         updateGallery();
  42.                         break;
  43.                 case R.id.main_bt2:
  44.                         // 异步listView加载
  45.                         Intent intent = new Intent();
  46.                         intent.setClass(this, ListViewLoadActivity.class);
  47.                         startActivity(intent);
  48.                         break;
  49.                 }
  50.         }

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

  53.         }

  54.         @Override
  55.         protected void onDestroy() {
  56.                 super.onDestroy();
  57.         }
  58. }

  59. adapter:
  60. public class InternetGalleryAdapter extends BaseAdapter {
  61.         private Context context;
  62.         private String[] imageURL;
  63.         // private int mGalleryItemBackground;
  64.         private Bitmap[] Bitmaps;

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

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

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

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

  84.         }

  85.         @Override
  86.         public int getCount() {
  87.                 return imageURL.length;
  88.         }

  89.         @Override
  90.         public Object getItem(int position) {
  91.                 return Bitmaps[position];
  92.         }

  93.         @Override
  94.         public long getItemId(int position) {
  95.                 return position;
  96.         }

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

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

  105.                 imageView.setScaleType(ImageView.ScaleType.FIT_XY);
  106.                 imageView.setLayoutParams(new Gallery.LayoutParams(100,
  107.                                 LayoutParams.FILL_PARENT));
  108.                 imageView.setPadding(0, 0, 0, 0);
  109.                 // imageView.setBackgroundResource(mGalleryItemBackground);
  110.                 return imageView;
  111.         }

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

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

  137.         }

  138.         final Handler cwjHandler = new Handler();

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

  145. 类2:listViewLoad
  146. public class ListViewLoadActivity extends ListActivity implements
  147.                 OnScrollListener {
  148.         private LinearLayout mLoadLayout;
  149.         private ListView mListView;
  150.         private ListViewAdapter mListViewAdapter = new ListViewAdapter();
  151.         private int mLastItem = 0;
  152.         private int mCount = 41;
  153.         private final Handler mHandler = new Handler();
  154.         private final LayoutParams mProgressBarLayoutParams = new LinearLayout.LayoutParams(
  155.                         LinearLayout.LayoutParams.WRAP_CONTENT,
  156.                         LinearLayout.LayoutParams.WRAP_CONTENT);
  157.         private final LayoutParams mTipContentLayoutParams = new LinearLayout.LayoutParams(
  158.                         LinearLayout.LayoutParams.WRAP_CONTENT,
  159.                         LinearLayout.LayoutParams.WRAP_CONTENT);

  160.         @Override
  161.         public void onCreate(Bundle savedInstanceState) {
  162.                 super.onCreate(savedInstanceState);
  163.                 /**
  164.                  * "加载项"布局,此布局被添加到ListView的Footer中。
  165.                  */
  166.                 mLoadLayout = new LinearLayout(this);
  167.                 mLoadLayout.setMinimumHeight(60);
  168.                 mLoadLayout.setGravity(Gravity.CENTER);
  169.                 mLoadLayout.setOrientation(LinearLayout.HORIZONTAL);
  170.                 /**
  171.                  * 向"加载项"布局中添加一个圆型进度条。
  172.                  */
  173.                 ProgressBar mProgressBar = new ProgressBar(this);
  174.                 mProgressBar.setPadding(0, 0, 15, 0);
  175.                 mLoadLayout.addView(mProgressBar, mProgressBarLayoutParams);
  176.                 /**
  177.                  * 向"加载项"布局中添加提示信息。
  178.                  */
  179.                 TextView mTipContent = new TextView(this);
  180.                 mTipContent.setText("加载中...");
  181.                 mLoadLayout.addView(mTipContent, mTipContentLayoutParams);
  182.                 /**
  183.                  * 获取ListView组件,并将"加载项"布局添加到ListView组件的Footer中。
  184.                  */
  185.                 mListView = getListView();
  186.                 mListView.addFooterView(mLoadLayout);
  187.                 /**
  188.                  * 组ListView组件设置Adapter,并设置滑动监听事件。
  189.                  */
  190.                 setListAdapter(mListViewAdapter);
  191.                 mListView.setOnScrollListener(this);
  192.         }

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

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

  218.         class ListViewAdapter extends BaseAdapter {
  219.                 int count = 10;

  220.                 public int getCount() {
  221.                         return count;
  222.                 }

  223.                 public Object getItem(int position) {
  224.                         return position;
  225.                 }

  226.                 public long getItemId(int position) {
  227.                         return position;
  228.                 }

  229.                 public View getView(int position, View view, ViewGroup parent) {
  230.                         TextView mTextView;
  231.                         if (view == null) {
  232.                                 mTextView = new TextView(ListViewLoadActivity.this);
  233.                         } else {
  234.                                 mTextView = (TextView) view;
  235.                         }
  236.                         mTextView.setText("Item " + position);
  237.                         mTextView.setTextSize(20f);
  238.                         mTextView.setGravity(Gravity.CENTER);
  239.                         mTextView.setHeight(60);
  240.                         return mTextView;
  241.                 }
  242.         }

  243. }

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

  251.     <TextView
  252.         android:layout_width="fill_parent"
  253.         android:layout_height="wrap_content"
  254.         android:text="@string/hello" />

  255.     <Gallery
  256.         android:id="@+id/main_gallery"
  257.         android:layout_width="fill_parent"
  258.         android:layout_height="80dp"
  259.         android:background="#55000000"
  260.         android:spacing="1dp" />

  261.     <Button
  262.         android:id="@+id/main_bt"
  263.         android:layout_width="fill_parent"
  264.         android:layout_height="wrap_content"
  265.         android:text="@string/hello" >
  266.     </Button>
  267.     
  268.     <Button
  269.         android:id="@+id/main_bt2"
  270.         android:layout_width="fill_parent"
  271.         android:layout_height="wrap_content"
  272.         android:text="@string/hello" >
  273.     </Button>

  274. </LinearLayout>
原创粉丝点击