关于ListView (1)——异步加载图片
2011-07-18 12:19
246 查看
效果:
主要解决listview读取图片时界面无响应的问题,当然这个方法也可以扩展到读取数据库数据等等
项目的布局如下:
首先加入网络的权限
<uses-permission android:name="android.permission.INTERNET" />
工具类,主要根据url读取图片返回流的方法
///////////Request.java
///////////ListViewReadImageAscy.java
private ImageAdapter adapter;
//数据源
private ArrayList<Bean> beans = new ArrayList<Bean>();
//内部类
//扩展BaseAdapter
//异步加载图片,为了简洁这里请求图片链接先固定。每读取好一个图片就更新,这里界面比较简单,当然你可以做成比较好的,像很多好的软件都有这种效果,先一个loading的效果,一旦有图片了就去掉loading,显示图片。
//这里还啰嗦一点就是AsyncTask里面重载的方法doInBackground操作不能涉及到更新UI界面,不然会出错。虽这样说,但是有时候遇到像我这种情况时,是很难知道出错就是这个原因导致的。异步加载一个view时,如果那个view里面有EditText,EditText在每次加载view都会触发焦点,这时候异步就会出错。可能我这样说不太清楚,但是如果试试就会发现这种情况。
设置数据源
主要解决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(); }
相关文章推荐
- 关于ListView异步加载图片导致图片显示混乱以及ListView ...
- 关于ListView (1)——异步加载图片
- 关于ListView中异步加载图片时,图片显示错误的问题
- 关于ListView异步加载图片导致图片显示混乱以及ListView效率问题探讨
- 关于ListView (1)——异步加载图片
- android listview异步加载图片类 (优化)
- listview异步加载图片优化
- 使用Volley框架异步加载图片+ListView图片加载错位解决
- Android ListView异步加载图片乱序问题,原因分析及解决方案
- Android ListView异步加载图片错位、重复、闪烁分析以及解决方案
- 利用AsyncTask高效异步加载图片,适用于ListView 和GridView
- Android实现ListView异步加载图片+缓存+线程池管理
- ListView异步加载图片
- Listview异步加载图片之优化篇
- android音乐播放器+异步加载+缓存+图片加载+listview列表显示+tomcat服务器+xml解析
- 关于融云(设置用户信息的提供者)异步请求 图片加载问题
- Android之ListView异步加载网络图片(优化缓存机制)
- Android ListView 异步加载图片
- Android之ListView异步加载网络图片(优化缓存机制)【转】
- ”郭神“---Android ListView异步加载图片乱序问题,原因分析及解决方案