当我想使用离子库从适配器加载图像时,我遇到了问题。
事实上,我的项目的字符串对应于我想要为gridview上的每个项目加载的图标图像的网址。
问题是由于适配器视图管理(如果我没有错,重用现有视图),我不知道如何绕过这个......
例如,如果我使用图像加载10个元素,则第一次使用它。然后,当我滚动到底部,然后滚动到顶部时,图像会发生变化(由于重用现有视图...)
你能帮助我吗?
这是我的适配器代码:
public class ProtocoleAdapter extends BaseAdapter {
private Context context;
private List<ProtocoleItem> mListe;
public ProtocoleAdapter(Context context, List<ProtocoleItem> liste) {
this.context = context;
this.mListe = liste;
}
private class ViewHolder {
TextView txtTitre;
ImageView img;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater
.inflate(R.layout.grid_item, null);
holder = new ViewHolder();
holder.txtTitre = (TextView) convertView
.findViewById(R.id.grid_item_label);
holder.img = (ImageView) convertView
.findViewById(R.id.grid_item_image);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final ProtocoleItem rowItem = mListe.get(position);
boolean isLoaded = false;
try {
Bitmap bitmap = Ion.with(context)
.load(rowItem.getImage())
.asBitmap()
.get();
isLoaded = true;
holder.img.setImageBitmap(bitmap);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
if (!isLoaded) {
if (position % 5 == 0) {
holder.img.setBackgroundColor(0xff176799);
} else {
if (position % 4 == 0) {
holder.img.setBackgroundColor(0xff2F87B0);
} else {
if (position % 3 == 0) {
holder.img.setBackgroundColor(0xff42A4BB);
} else {
if (position % 2 == 0) {
holder.img.setBackgroundColor(0xff5BC0C4);
} else {
holder.img.setBackgroundColor(0xff78D6C7);
}
}
}
}
}
holder.txtTitre.setText(rowItem.getTitre());
return convertView;
}
谢谢大家!
度过美好的一天
答案 0 :(得分:2)
获取最新版本的Ion并使用以下内容。
Ion.with(holder.img)
.load(rowItem.getImage());
此方法将异步加载。
您当前的使用是阻止UI线程。 Ion应该正确处理convertView回收,所以这不是问题。
答案 1 :(得分:-1)