BaseAdapter 回收问题 - Android
BaseAdapter recycling issue - Android
我有以下 BaseAdapter,问题是我看到了 ImageView 回收问题,其中图像显示在另一个 ImageView 中,问题仅在快速滚动时发生,我在这里做错了什么?
让我向您介绍一下我正在尝试做的事情的逻辑,我在代码中有两组组,组和用户,都是ArrayList。
现在 users.size() + groups.size() 给出了总计数,在 getView 中我必须判断这个视图是属于一个组还是属于一个用户。
public class ProfileAdapter extends BaseAdapter {
ArrayList<String> groups = new ArrayList<>();
ArrayList<String> users = new ArrayList<>();
count = users.size() + groups.size();
public int getCount() {
return count;
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = infalter.inflate(R.layout.grid_item, null);
holder = new ViewHolder();
holder.image = (ImageView) convertView.findViewById(R.id.grid_image);
holder.name = (TextView) convertView.findViewById(R.id.name);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.image.setImageResource(android.R.color.darker_gray);
if (position < groups.size()) {
//I'm in the group section so get me the group name
holder.name.setText(groups.get(position));
TextDrawable drawable = TextDrawable.builder().beginConfig()...;
holder.image.setImageDrawable(drawable);
} else {
//I'm in the user section so get me the user image
//this is where the problem is happening
imageLoader.displayImage( "file://" + users.get(position - groups.size()), holder.image);
}
return convertView;
}
class ViewHolder {
ImageView image;
TextView name;
}
}
我会说问题出在这里:
imageLoader.displayImage
- 是一个异步函数,在边缘情况下,任务可能会将图像加载到回收的 ImageView 中。
您应该在回收视图时尝试调用:imageLoader.cancelDisplayTask
在您正在回收的 ImageView 上。
我认为是因为您正在使用的 UIL 库,请查看此 comment
我有以下 BaseAdapter,问题是我看到了 ImageView 回收问题,其中图像显示在另一个 ImageView 中,问题仅在快速滚动时发生,我在这里做错了什么?
让我向您介绍一下我正在尝试做的事情的逻辑,我在代码中有两组组,组和用户,都是ArrayList。
现在 users.size() + groups.size() 给出了总计数,在 getView 中我必须判断这个视图是属于一个组还是属于一个用户。
public class ProfileAdapter extends BaseAdapter {
ArrayList<String> groups = new ArrayList<>();
ArrayList<String> users = new ArrayList<>();
count = users.size() + groups.size();
public int getCount() {
return count;
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = infalter.inflate(R.layout.grid_item, null);
holder = new ViewHolder();
holder.image = (ImageView) convertView.findViewById(R.id.grid_image);
holder.name = (TextView) convertView.findViewById(R.id.name);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.image.setImageResource(android.R.color.darker_gray);
if (position < groups.size()) {
//I'm in the group section so get me the group name
holder.name.setText(groups.get(position));
TextDrawable drawable = TextDrawable.builder().beginConfig()...;
holder.image.setImageDrawable(drawable);
} else {
//I'm in the user section so get me the user image
//this is where the problem is happening
imageLoader.displayImage( "file://" + users.get(position - groups.size()), holder.image);
}
return convertView;
}
class ViewHolder {
ImageView image;
TextView name;
}
}
我会说问题出在这里:
imageLoader.displayImage
- 是一个异步函数,在边缘情况下,任务可能会将图像加载到回收的 ImageView 中。
您应该在回收视图时尝试调用:imageLoader.cancelDisplayTask
在您正在回收的 ImageView 上。
我认为是因为您正在使用的 UIL 库,请查看此 comment