GridView使用Adapter异步加载图片下拉乱跳
2012-11-14 00:00
218 查看
GridView常用于列表展示图片,然而图片的加载又是很慢的,因此需要做异步加载。使用
Base
Adapter来进行异步加载的话,常常的写法是:
注意
这一句,这样子设置会有问题,
GridView在下拉的时候会出现乱跳的问题。原因是由于GridView使用了缓存机制,下拉传入getView的convertView是上面一页用过的,这时候虽然调用了setImageBitmap为blank,但是下拉的时候依然会先看到原来的图片(而不是blank),然后LoadTask加载完成后,又去更新ImageView,就出现了乱跳的情况。这个问题可能是由于Adapter的getVIew函数是异步在执行,因此导致调用setImageBitmap(blank),不能马上成功。解决方法是
加了2个地方:
1.更新ImageView的bitmap使用handler.post的方法来更新。这样会比在getView中使用imageView.setImageBitmap来更新得更快。
2.在getView中,更新imageVIew的position。在更新bitmap的时候要先进行比对position。如果对应,则进行更新。
这样做了过后就能保证GridVIew的下拉不会出现乱跳的问题。 汗啊,整了一天才发现这个问题所在。记录下来,以示后人。
Base
Adapter来进行异步加载的话,常常的写法是:
@Override public View getView(int position, View convertView, ViewGroup parent) { ImageView image = null; if (convertView == null) { imageView = (ImageView) getLayoutInflater().inflate( R.layout.item, parent, false); } else { imageView = (ImageView) convertView; } asynLoadBitmap(imageView,position);//异步去加载图片 } private HashMap<Int position,Bitmap> cache = null; public void asynLoadBitmap(ImageView image){ Bitmap bit = cache.get(position); if(bit ==null){ //需要设置为默认的图片来显示 image.setImageBitmap(blank); //使用Task或者是线程去加载图片 new LoadTask().execute(); }else{ image.setImageBitmap(bit); } }
注意
image.setImageBitmap(blank);
这一句,这样子设置会有问题,
GridView在下拉的时候会出现乱跳的问题。原因是由于GridView使用了缓存机制,下拉传入getView的convertView是上面一页用过的,这时候虽然调用了setImageBitmap为blank,但是下拉的时候依然会先看到原来的图片(而不是blank),然后LoadTask加载完成后,又去更新ImageView,就出现了乱跳的情况。这个问题可能是由于Adapter的getVIew函数是异步在执行,因此导致调用setImageBitmap(blank),不能马上成功。解决方法是
@Override public View getView(int position, View convertView, ViewGroup parent) { ImageView image = null; if (convertView == null) { imageView = (ImageView) getLayoutInflater().inflate( R.layout.item, parent, false); } else { imageView = (ImageView) convertView; } imageView.setTag(position); asynLoadBitmap(imageView,position);//异步去加载图片 } private HashMap<Int position,Bitmap> cache = null; public void asynLoadBitmap(ImageView image){ Bitmap bit = cache.get(position); if(bit ==null){ //需要设置为默认的图片来显示 setImageBitmap(image,blank,new Handler()); //使用Task或者是线程去加载图片 new LoadTask(image,new Handler(),position).execute(); }else{ image.setImageBitmap(bit); } } public void LoadTask extends Runable(){ ImageView view; Handler handler; int position; public LoadTask(ImageView view,Handler handler,int position){ this.view = view; this.handler = handler; this.position = position; } public void run(){ Bitmap bit = loadBitmap(); setImageBitmap(view,bit,handler,position); } } private void setImageBitmap(final ImageView view,final Bitmap bit,Handler handler,int position){ if(view.getTag() == position){ handler.post(new Raunable(){ public void run(){ view.setImageBitmap(bit); } }); } }
加了2个地方:
1.更新ImageView的bitmap使用handler.post的方法来更新。这样会比在getView中使用imageView.setImageBitmap来更新得更快。
2.在getView中,更新imageVIew的position。在更新bitmap的时候要先进行比对position。如果对应,则进行更新。
这样做了过后就能保证GridVIew的下拉不会出现乱跳的问题。 汗啊,整了一天才发现这个问题所在。记录下来,以示后人。
相关文章推荐
- listView利用BaseAdapter及异步任务Gson解析,使用Picasso网络获取资源进行图文混排,PullToRefresh上拉刷新下拉加载
- 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)
- Android使用GridView异步加载(弱引用)网络图片(支持点击查看)
- 在GridView或者ListView的Adapter中使用Glide加载图片,图片被拉伸问题
- 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)
- GridView使用AsyncTask模拟异步加载大量图片
- Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
- Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
- Android图片异步加载之Android-Universal-Image-Loader使用1
- ios UITableView封装之下拉-上提-图片异步加载
- Android ListView异步加载图片错位解决方案一 使用findViewWithTag
- 开源中国iOS客户端学习——(十四)使用EGOImageLoading异步加载图片
- Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
- android 安卓异步加载网络图片,与viewpager结合使用示例
- Android异步下载网络图片&android解析xml文件的方式&使用Adapter为ListView提供数据
- Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
- IOS学习之路二十三(EGOImageLoading异步加载图片开源框架使用)
- android之GridView异步加载图片时显示加载进度ProgressBar
- 使用Volley框架异步加载图片+ListView图片加载错位解决
- 异步批量加载网络图片,并使用二级缓存.