展会信息港展会大全

GridView使用Adapter异步加载图片下拉乱跳动 android教程
来源:互联网   发布日期:2015-10-03 10:52:49   浏览:1551次  

导读:GridView常用于列表展示图片,然而图片的加载又是很慢的,因此需要做异步加载。使用 Base Adapter来进行异步加载的话,常常的写法是:@Overridepublic View getView(int position, View convertView, Vi......

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的下拉不会出现乱跳的问题。

赞助本站

人工智能实验室

相关热词: GridView Adapter 异步加载

相关内容
AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港