我正在做一个小项目,我在其中创建了一个绑定(bind)到 ArrayAdapter 的 listview
。在 ArrayAdapter 的 getView()
函数中,我在线程上从网络 urls
加载图像,并将它们设置为列表项(当然基于位置,所以 url[0]
图片设置为 list_item[0]
等)。这一切似乎都运作良好。
但是,当我测试该应用程序时,我注意到如果我等待我的 ListView 完全显示,然后来回快速滚动,我有时会看到一个列表项上的图像错位在其他列表项上(就像处于中间状态)。但是,直到我将错误显示的项目滚动出屏幕然后再返回时,它才会消失。
我不知道这是否与我使用线程加载 web url
有关,或者从本地资源文件夹加载图像可能有同样的问题。
这实际上引出了我对 getView()
函数的疑问。我认为我的 getView()
中的逻辑是正确的,因为它就像将 url 绑定(bind)到基于位置查看一样简单。每当 getView()
有机会被调用时,例如当我将项目滚动出屏幕然后返回时,它将使列表项目正确显示。
我不明白的是如何解释发生的问题(如中间状态),以及如何在编写代码时避免它?
我在下面粘贴了我的适配器代码 fragment ,但我认为这个问题可能是一个普遍的问题:
@Override
public View getView(int position, View v, ViewGroup parent) {
ViewHolder viewHolder = null;
if (v == null) {
LayoutInflater inflater = (LayoutInflater) getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(layoutResourceId, parent, false);
viewHolder = new ViewHolder();
viewHolder.title = (TextView) v.findViewById(R.id.title);
viewHolder.description = (TextView) v.findViewById(R.id.description);
viewHolder.image = (ImageView) v.findViewById(R.id.image);
v.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) v.getTag();
}
listItem item = items[position]; //items is some global array
//passed in to ArrayAdapter constructor
if (item != null) {
viewHolder.title.setText(item.title);
viewHolder.description.setText(item.description);
if (!(item.imageHref).equalsIgnoreCase("null")) {
mDrawableManager.fetchDrawableOnThread(item.imageHref, viewHolder.image);
} else {
viewHolder.image.setImageDrawable(null);
}
}
return v;
}
}
static class ViewHolder {
TextView title;
TextView description;
ImageView image;
}
最佳答案
当快速滚动时,我遇到了同样的问题,它将某些项目的值与其他项目交替,就像某些项目的背景颜色随机变化一样。我通过大量搜索解决了这个问题,并找到了确切的解决方案,如果您在适配器中使用 ViewHolder,只需在适配器中添加这两种方法
@Override
public int getViewTypeCount() {
return getCount();
}
@Override
public int getItemViewType(int position) {
return position;
}
关于android - 快速滚动 ListView 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13083597/