我已经用谷歌搜索了这个但找不到答案,所以这里......
我有一个显示一些文本和图像的 ListView。底层适配器出于性能原因(根据推荐的方法)回收视图,并且我根据 Android Developers 站点的位图页面上的建议使用 AsynchTask 加载图像。
一切都完美而顺利,但我有一个问题。当适配器中的 View 被回收时,它仍然有对旧图像(ImageView)的引用。如果用户滚动缓慢,则 AsynchTask 有足够的时间来加载新图像并显示它,因此用户看不到新图像的重新加载。
但是,如果用户滚动得很快,加载图像的延迟意味着他们在被新图像替换之前看到旧图像(当视图被另一个项目使用时加载)。
所以,我的问题是,我怎样才能检测到 View 何时在屏幕上不再可见,然后我可以删除图像?这意味着用户会看到一个空的列表视图项目,该项目最终将加载适当的图像,这样看起来会更好。
提前谢谢了。这是列表视图适配器代码。
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View view = convertView;
ListViewHolder viewHolder;
// if this is not a recycled view then create a new view for the data...
if (view == null)
{
view = this.inflater.inflate(R.layout.target_list_view_layout, null, true);
viewHolder = new ListViewHolder();
viewHolder.manufacturer = (TextView) view.findViewById(R.id.manufacturer);
viewHolder.targetName = (TextView) view.findViewById(R.id.targetName);
viewHolder.targetThumbnail = (ImageView) view.findViewById(R.id.targetThumbnail);
view.setTag(viewHolder);
} else
{
viewHolder = (ListViewHolder) convertView.getTag();
}
TargetDescriptor targetDescriptor = this.selectedTargets.get(position);
viewHolder.manufacturer.setText(targetDescriptor.manufacturer);
viewHolder.targetName.setText(targetDescriptor.targetName);
// At this point I pass the image view reference to my background task to load the image
LoadImageViewAsynchTask loadImageTask = new LoadImageViewAsynchTask(viewHolder.targetThumbnail, targetDescriptor);
loadImageTask.execute(new Integer[]
{ 64, 64 });
return view;
}
编辑:如果有帮助,那些使用 eBay Android 应用程序的人可以看到我正在寻找的效果。