关于ListView (1)——异步加载图片
来源:互联网 发布:无标度网络应用 编辑:程序博客网 时间:2024/04/25 12:32
效果:
主要解决listview读取图片时界面无响应的问题,当然这个方法也可以扩展到读取数据库数据等等
项目的布局如下:
首先加入网络的权限
<uses-permission android:name="android.permission.INTERNET" />
工具类,主要根据url读取图片返回流的方法
///////////Request.java
public class Request {
public static InputStream HandlerData(String url) {
InputStream inStream=null;
try {
URL feedUrl = new URL(url);
URLConnection conn = feedUrl.openConnection();
conn.setConnectTimeout(10 * 1000);
inStream = conn.getInputStream();
} catch (Exception e) {
e.printStackTrace();
}
return inStream;
}
}
///////////ListViewReadImageAscy.java
private ImageAdapter adapter;
//数据源
private ArrayList<Bean> beans = new ArrayList<Bean>();
//内部类
public class Bean {
private Bitmap image;
public Bitmap getImage() {
return image;
}
public void setImage(Bitmap image) {
this.image = image;
}
}
//扩展BaseAdapter
public class ImageAdapter extends BaseAdapter {
public ImageAdapter(Context context) {
}
@Override
public int getCount() {
return beans.size();
}
@Override
public Bean getItem(int position) {
return beans.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView i = new ImageView(getApplicationContext());
Bean b = beans.get(position);
//如果有图片则读取,没有则跳过
if (b.getImage() != null) {
i.setImageBitmap(b.getImage());
}
return i;
}
}
//异步加载图片,为了简洁这里请求图片链接先固定。每读取好一个图片就更新,这里界面比较简单,当然你可以做成比较好的,像很多好的软件都有这种效果,先一个loading的效果,一旦有图片了就去掉loading,显示图片。
//这里还啰嗦一点就是AsyncTask里面重载的方法doInBackground操作不能涉及到更新UI界面,不然会出错。虽这样说,但是有时候遇到像我这种情况时,是很难知道出错就是这个原因导致的。异步加载一个view时,如果那个view里面有EditText,EditText在每次加载view都会触发焦点,这时候异步就会出错。可能我这样说不太清楚,但是如果试试就会发现这种情况。
public class ImageLoadTask extends AsyncTask<Void, Void, Void> {
private ImageAdapter adapter;
// 初始化
public ImageLoadTask(Context context, ImageAdapter adapter) {
this.adapter = adapter;
}
@Override
protected Void doInBackground(Void... params) {
for (int i = 0; i < adapter.getCount(); i++) {
Bean bean = adapter.getItem(i);
Bitmap bitmap = BitmapFactory
.decodeStream(Request
.HandlerData("http://avatar.profile.csdn.net/A/E/5/2_piaopiaohu123.jpg"));
bean.setImage(bitmap);
publishProgress(); // 通知去更新UI
}
return null;
}
public void onProgressUpdate(Void... voids) {
if (isCancelled())
return;
// 更新UI
adapter.notifyDataSetChanged();
}
}
设置数据源
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
for (int i = 0; i < 15; i++) {
Bean b = new Bean();
b.setImage(BitmapFactory.decodeResource(getResources(),
R.drawable.icon));
beans.add(b);
}
adapter = new ImageAdapter(this);
ListView listview = new ListView(this);
listview.setAdapter(adapter);
adapter.notifyDataSetChanged();
setContentView(listview);
new ImageLoadTask(this, adapter).execute();
}
本文为原创,如需转载,请注明作者和出处,谢谢!
http://www.cnblogs.com/not-code/archive/2011/05/03/2035421.html
代码下载
http://files.cnblogs.com/not-code/ListViewReadImageAsyn.rar
- 关于ListView (1)——异步加载图片
- listview 异步加载图片
- ListView异步加载图片
- ListView 异步加载图片
- ListView异步加载图片
- ListView 异步加载图片
- listview异步图片加载
- ListView异步加载图片
- listview 异步加载图片
- listView异步加载图片
- ListView异步加载图片
- ListView异步加载图片
- listView 异步加载图片
- listview异步加载图片
- Android ListView&异步加载的学习(二)——多线程加载图片
- Android ListView&异步加载的学习(三)——AsyncTask加载图片&运用Lru算法优化图片加载
- ListView异步加载图片(双缓存)
- android listview异步加载图片(详细)
- 二.矩阵与变换
- Matrix
- [Leetcode]Distinct Subsequences
- android apk签名(为什么 如何做 验证)
- 关于ListView (2)——SimpleAdapter源码解析与ViewBinders的用法
- 关于ListView (1)——异步加载图片
- 使用URL和URLConnection(多线程下载)
- 使用urlconnection和json发送post请求到服务器
- 编译v8引擎
- Android AsyncTask
- Java设计模式之单例模式(singleton模式)
- python DES加密
- Android选项卡(TabWidget)例子
- Java的运算符号(逻辑与、或、非、移位运算)