我正在做一个小项目,我在其中创建了listview
一个 ArrayAdapter 的绑定。在getView()
ArrayAdapter 的功能中,我urls
在线程上从 web 加载图像,并将它们设置为列表项(当然基于位置,因此url[0]
图像设置为list_item[0]
etc)。这一切似乎运作良好。
但是,当我测试应用程序时,我注意到如果我等待列表视图完全显示,然后来回快速滚动,我会看到有时一个列表项上的图像错位在另一个列表项上(比如处于中间状态) . 但是,直到我将错误显示的项目滚动出屏幕然后再返回,它才会消失。
我不知道这是否与我url
使用线程加载网络有关,或者从本地资源文件夹加载图像可能会遇到同样的问题。
这实际上导致了我对getView()
功能的疑问。我认为我的逻辑是正确的,getView()
因为它就像将 url 绑定到基于位置的视图一样简单。每当getView()
有机会被调用时,比如当我将一个项目滚动出屏幕然后返回时,它都会使列表项正确显示。
我不明白的是如何解释发生的问题(如中间状态),以及在编写代码时如何避免它?
我将我的适配器代码粘贴在下面,但我认为这个问题可能是一个普遍的问题:
@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;
}