上拉下拉刷新(2)网络加载图片
来源:互联网 发布:软件开发人员外包 编辑:程序博客网 时间:2024/04/29 11:31
activity:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.zhangli.xiala.MainActivity" > <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView></LinearLayout>
myview:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/textView" android:layout_gravity="center" android:gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>
UrlDemo:
存放网络加载数据的一个类:
package com.zhangli.xiala;import java.io.BufferedInputStream;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;public class UrlDemo {public static byte[] loadRawDataFromURL(String u) throws Exception {URL url = new URL(u);HttpURLConnection conn = (HttpURLConnection) url.openConnection();InputStream is = conn.getInputStream();BufferedInputStream bis = new BufferedInputStream(is);ByteArrayOutputStream baos = new ByteArrayOutputStream();final int BUFFER_SIZE = 2048;final int EOF = -1;int c;byte[] buf = new byte[BUFFER_SIZE];while (true) {c = bis.read(buf);if (c == EOF)break;baos.write(buf, 0, c);}conn.disconnect();is.close();byte[] data = baos.toByteArray();baos.flush();return data;}}
MainActivity:
package com.zhangli.xiala;import java.util.ArrayList;import java.util.HashMap;import android.app.Activity;import android.app.ProgressDialog;import android.content.Context;import android.content.res.Resources;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.ArrayAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends Activity {// 数据源private ArrayList<HashMap<String, Object>> data;private String IMAGE_KEY = "image", TEXT_KEY = "text";private ArrayAdapter adapter;private ListView listView;private Activity activity;private String URL_IMAGE = "http://avatar.csdn.net/F/E/F/1_zhangli_.jpg";private String CACHE_URL_KEY = "cache_url_key", CACHE_BITMAP = "cache_bitmap";private ArrayList<HashMap<String, Object>> cache;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);activity = this;Resources res = getResources();data = new ArrayList<HashMap<String, Object>>();cache = new ArrayList<HashMap<String, Object>>();for (int i = 0; i < 20; i++) {HashMap<String, Object> map = new HashMap<String, Object>();map.put(IMAGE_KEY, BitmapFactory.decodeResource(res, R.drawable.ic_launcher));map.put(TEXT_KEY, i);data.add(map);}listView = (ListView) findViewById(R.id.listView);adapter = new MyAdapter(this, -1);listView.setAdapter(adapter);listView.setOnScrollListener(new OnScrollListener() {private int firstVisibleItem, visibleItemCount, totalItemCount;/** * firstVisibleItem:第一条数据 visibleItemCount:屏幕显示的数据数量 * totalItemCount:总的数据数量 */@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {// isTop:true表示ListView完全見頂部。isBottom:true,listview完全見底。boolean isTop = false, isBottom = false;if ((visibleItemCount > 0) && (firstVisibleItem == 0)) {if (view.getChildAt(0).getTop() >= 0) {isTop = true;}} else if ((totalItemCount > 0) && (view.getLastVisiblePosition() == totalItemCount - 1)) {if (view.getBottom() == view.getChildAt(view.getChildCount() - 1).getBottom()) {isBottom = true;}}// SCROLL_STATE_IDLE表示刷新完成boolean b = false;if (firstVisibleItem == totalItemCount - visibleItemCount) {b = true;};if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {if (firstVisibleItem == 0 && isTop) {new AddTopAsyncTask().execute(URL_IMAGE);} else if (isBottom && b) {new AddBottomAsyncTask().execute(URL_IMAGE);}}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {this.firstVisibleItem = firstVisibleItem;this.visibleItemCount = visibleItemCount;this.totalItemCount = totalItemCount;}});}private void loadNewDate(String url) {// 检查缓存for (int i = 0; i < cache.size(); i++) {HashMap<String, Object> map = cache.get(i);String u = map.get(CACHE_URL_KEY) + "";if (u.equals(url)) {// 发现有相同的缓存,直接取出来加载Bitmap bmp = (Bitmap) map.get(CACHE_BITMAP);Topadd(bmp);return;}}// 没有法相相同的缓存,开启线程下载new AddTopAsyncTask();}private class MyAdapter extends ArrayAdapter {private LayoutInflater mLayoutInflater;public MyAdapter(Context context, int resource) {super(context, resource);mLayoutInflater = LayoutInflater.from(context);}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null)convertView = mLayoutInflater.inflate(R.layout.myview, null);ImageView image = (ImageView) convertView.findViewById(R.id.imageView);TextView text = (TextView) convertView.findViewById(R.id.textView);HashMap<String, Object> map = getItem(position);image.setImageBitmap((Bitmap) (map.get(IMAGE_KEY)));text.setText(map.get(TEXT_KEY) + "");return convertView;}@Overridepublic HashMap<String, Object> getItem(int position) {return data.get(position);}@Overridepublic int getCount() {return data.size();}}// 下拉刷新private class AddTopAsyncTask extends AsyncTask<String, Integer, Bitmap> {private ProgressDialog pd;@Overrideprotected void onPreExecute() {pd = new ProgressDialog(activity);pd.setMessage("请稍候,正在下拉刷新加载头部数据。。。");// 设置样式:进度条显示样式pd.setProgressStyle(pd.STYLE_HORIZONTAL);pd.show();}@Overrideprotected void onProgressUpdate(Integer... values) {int value = values[0];pd.setProgress(value);}@Overrideprotected Bitmap doInBackground(String... params) {String url = params[0];for (int i = 0; i < 100; i++) {// 调用上面的onProgressUpdate方法 实现不断增长进度条publishProgress(i);try {Thread.sleep(20);} catch (Exception e) {e.printStackTrace();}}try {byte[] bytes = UrlDemo.loadRawDataFromURL(url);Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);// 将加载的数据添加到缓存队列中HashMap<String, Object> map = new HashMap<String, Object>();map.put(CACHE_URL_KEY, url);map.put(CACHE_BITMAP, bmp);cache.add(map);return bmp;} catch (Exception e) {e.printStackTrace();}return null;}@Overrideprotected void onPostExecute(Bitmap result) {pd.dismiss();Topadd(result);}}// 上拉刷新private class AddBottomAsyncTask extends AsyncTask<String, Integer, Bitmap> {private ProgressDialog pd;@Overrideprotected void onPreExecute() {pd = new ProgressDialog(activity);pd.setMessage("请稍候,正在上拉刷新加载头部数据。。。");// 设置样式:进度条显示样式pd.setProgressStyle(pd.STYLE_HORIZONTAL);pd.show();}@Overrideprotected void onProgressUpdate(Integer... values) {int value = values[0];pd.setProgress(value);}@Overrideprotected Bitmap doInBackground(String... params) {String url = params[0];for (int i = 0; i < 100; i++) {// 调用上面的onProgressUpdate方法 实现不断增长进度条publishProgress(i);try {Thread.sleep(20);} catch (Exception e) {e.printStackTrace();}}try {byte[] bytes = UrlDemo.loadRawDataFromURL(url);Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);// 将加载的数据添加到缓存队列中HashMap<String, Object> map = new HashMap<String, Object>();map.put(CACHE_URL_KEY, url);map.put(CACHE_BITMAP, bmp);cache.add(map);return bmp;} catch (Exception e) {e.printStackTrace();}return null;}@Overrideprotected void onPostExecute(Bitmap result) {pd.dismiss();bottomadd(result);}}public void Topadd(Bitmap obj) {// Bitmap bmp = (Bitmap) obj;HashMap<String, Object> map = new HashMap<String, Object>();map.put(IMAGE_KEY, obj);map.put(TEXT_KEY, data.size());data.add(0, map);adapter.notifyDataSetChanged();}public void bottomadd(Bitmap obj) {HashMap<String, Object> map = new HashMap<String, Object>();map.put(IMAGE_KEY, obj);map.put(TEXT_KEY, data.size());data.add(map);adapter.notifyDataSetChanged();// 信息保持在最底部listView.setSelection(ListView.FOCUS_DOWN);}}
上一篇:上拉下拉刷新(1)地址:http://blog.csdn.net/zhangli_/article/details/50318713
0 0
- 上拉下拉刷新(2)网络加载图片
- Android pulltorefresh上拉下拉刷新加载
- 上拉下拉加载
- PullToRefreshScrollView刷新轮播图和ListView以及上拉下拉、网络获取图片并提示
- ListView上拉下拉刷新
- UITableView上拉下拉刷新
- UITableableview上拉下拉刷新
- 上拉下拉刷新XListView
- 上拉下拉刷新(1)
- 上拉下拉刷新数据
- PulltoRefresh上拉下拉刷新
- 上拉下拉刷新类
- XListview 上拉下拉刷新
- PullToRefreshListView上拉下拉刷新
- Qml上拉下拉刷新
- Jquery 判断滚动条到达顶部或底部 (可用于上拉下拉加载刷新)
- 轮播图加载Imageloader图片,Xlistview上拉下拉
- Android之xListView网络请求上拉下拉加载
- 线性回归
- You Can't Manage What You Don't Measure
- MATLAB——scatter的简单应用
- openjudge放苹果
- android 使用String.format("%.2f",67.876)自已定义语言(俄语、西班牙语)会把小数点变为逗号
- 上拉下拉刷新(2)网络加载图片
- 除去pdf文件内部的超链接/a标签
- java.lang.RuntimeException: setAudioSource failed.
- 2015河南科技学院高校CSDN俱乐部与计算机协会共同举办PPT大赛
- Java WebService-CXF-基于SOAP的Web服务
- 利用软妹纸ui写的前端
- Java的国际化支持(I18N问题)
- 我的国一之路
- 使用eclipse发布web服务出现"Error occured when adding the module, xxxxxx, to the server"