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

本文详细介绍了如何在Android应用中实现互联网画廊功能及列表视图的异步加载,包括画廊适配器、图片加载机制以及列表视图的滚动监听与加载更多数据的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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. <Button
  268. android:id="@+id/main_bt2"
  269. android:layout_width="fill_parent"
  270. android:layout_height="wrap_content"
  271. android:text="@string/hello" >
  272. </Button>

  273. </LinearLayout>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值