【发布时间】:2013-11-03 11:06:15
【问题描述】:
我正在使用自定义 ArrayAdapter 来实现 ListFragment 以填充列表。每个行项都有一个 ImageView 和三个 TextView。正在通过 XML 解析数据,并且正在异步加载图像。
我遇到的问题是 ListView 填充并且看起来不错,但是滚动时出现问题。我可以一次在屏幕上放置 7 个项目。当我滚动到第 8 行时,它突然发生了变化,因此应该出现下一行。它仅在可被 8 整除的行上执行(即第 8、16、24 行等)。
我正在使用 ViewHolder 模式来确保此 ListView 具有良好的速度。我认为问题出在某个地方,但我已经四处搜索,看来我正在正确地执行此模式,并且为了解决此问题,我已经用完了要检查的东西。我究竟做错了什么?谢谢!
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
MyViewHolder holder;
if (row == null) {
LayoutInflater inflater = LayoutInflater.from(mContext);
row = inflater.inflate(R.layout.browse_result_list_item, null, false);
holder = new MyViewHolder();
holder.adTitle = (TextView) row.findViewById(R.id.adTitle);
holder.region = (TextView) row.findViewById(R.id.region);
holder.time = (TextView) row.findViewById(R.id.time);
holder.thumbnail = (ImageView) row.findViewById(R.id.browseThumbnail);
row.setTag(holder);
} else {
holder = (MyViewHolder) row.getTag();
}
SearchResult result = mObjects.get(position);
holder.adTitle.setText(result.getTitle().substring(0, result.getTitle().length()-3)); // three ... at the end, remove them
holder.region.setText(result.getRegion());
holder.time.setText(result.getPostingTime());
// Download the image thumbnail
ArrayList<String> urls = result.getImageUrls();
if (urls.size() > 0)
download(urls.get(0), holder.thumbnail);
else // No image for this post, put a placeholder
holder.thumbnail.setImageResource(R.drawable.ic_action_picture);
return row;
}
private static class MyViewHolder {
public static TextView adTitle;
public static TextView region;
public static TextView time;
public static ImageView thumbnail;
}
编辑:感谢@frozenkoi,我找到了solution。最终成为 ViewHolder 中的静态变量导致问题。它们现在只是公共的,并且类是静态的,问题已经解决了。
【问题讨论】:
-
您没有显示
download函数的代码。最有可能当您滚动时,您有两个异步下载更新相同的ImageView。您需要确保当ListView回收一行视图时,它仅由正确的下载器更新,而不是由该视图之前表示的行的下载器更新。 -
如果这句话读作“它突然变为应该出现的下一行。”反而?你能举一个效果的例子吗? 1 2 3 4 5 6 7 变成什么?
-
更多关于在列表或网格视图中延迟加载图像的信息:stackoverflow.com/questions/541966/…
-
如果对stackoverflow.com/questions/16789676/…有帮助,请勾选此项。延迟加载