[转载]Android关于ListView (1)——异步加载图片

[转载]关于ListView (1)——异步加载图片 – 没有代码 – 博客园.

效果:

主要解决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 beans = new ArrayList();

//内部类
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 {

private ImageAdapter adapter;

// 初始化

public ImageLoadTask(Context context, ImageAdapter adapter) {

this.adapter = adapter;

}

@Override

protected Void doInBackground(Void... params) {

for (int i = 0; i &lt; 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 &lt; 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

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏