使用AsyncTask时如何判断项目是否已在listview中回收?

时间:2013-09-30 21:17:43

标签: android android-listview android-asynctask

我正在关注developer.android.com上的文章 "Making ListView Scrolling Smooth"

代码的片段是:

protected void onPostExecute(Bitmap result) { 
    super.onPostExecute(result); 
    if (v.position == position) { 
        // If this item hasn't been recycled already, hide the 
        // progress and set and show the image 
        v.progress.setVisibility(View.GONE); 
        v.icon.setVisibility(View.VISIBLE); 
        v.icon.setImageBitmap(result); 
    } 
} 

我不明白变量“位置”是什么。为什么“v.position == position”可以判断该项目是否未被回收。

我尝试了这个想法:设置一个类变量位置等于getView中的位置。但它不起作用。

我还找到了一个类似的代码来执行异步任务 “Multithreading For Performance”, 它使用“WeakReference”来判断项目是否存在。 这两种方式同样有效吗?

1 个答案:

答案 0 :(得分:1)

当适配器回收视图时,位置会发生变化。这是由框架自动发生的,直到您检查了值之后才会知道它发生了。上次将视图传递给getView()时设置的自定义ViewHolder对象仍然存在,因此它是一个方便的位置,可以跟踪工作开始时的位置。如果它们不匹配,View已被回收,因此您不应该设置位图,因为它是错误的。