Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用AsyncTask时,如何判断该项是否已在listview中回收?_Android_Android Listview_Android Asynctask - Fatal编程技术网

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

Android 使用AsyncTask时,如何判断该项是否已在listview中回收?,android,android-listview,android-asynctask,Android,Android Listview,Android Asynctask,我正在关注developer.android.com上的文章 代码片段是: 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

我正在关注developer.android.com上的文章

代码片段是:

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中的位置。但它不起作用

我还发现了一个类似的代码来执行异步任务 "", 它使用“WeakReference”来判断该项是否存在。
这两种方法是否同样有效?

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

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

谢谢。所以我应该设置一个类变量mPosition。让mPosition=getView()中的位置。让viewHolder.position=getView()中的位置。在onPostExecute中,我将检查viewHolder.position==mPosition。然而,这是行不通的。请告诉我我的上述逻辑是错误的。我的listview中有4项。只有最后一项显示图标。实际上,我认为当适配器逐个访问项目时,位置会发生变化。因此,当这4个项目在listview中时,第一个项目仍在执行异步任务,但getView会导航到第二个项目。您是为每次调用getView()创建一个新的ViewHolder对象,还是每次跨多个视图使用同一个对象?ViewHolder是在getView中创建的。如果我注释掉判断语句“viewHolder.position==position”,它工作得很好,这意味着viewHolder对象中的成员指向正确的对象。请确保不要每次都创建新的viewHolder。对于新的(非回收)视图,您只需要一个新的ViewHolder。谢谢。所以我应该设置一个类变量mPosition。让mPosition=getView()中的位置。让viewHolder.position=getView()中的位置。在onPostExecute中,我将检查viewHolder.position==mPosition。然而,这是行不通的。请告诉我我的上述逻辑是错误的。我的listview中有4项。只有最后一项显示图标。实际上,我认为当适配器逐个访问项目时,位置会发生变化。因此,当这4个项目在listview中时,第一个项目仍在执行异步任务,但getView会导航到第二个项目。您是为每次调用getView()创建一个新的ViewHolder对象,还是每次跨多个视图使用同一个对象?ViewHolder是在getView中创建的。如果我注释掉判断语句“viewHolder.position==position”,它工作得很好,这意味着viewHolder对象中的成员指向正确的对象。请确保不要每次都创建新的viewHolder。对于新的(非循环)视图,您只需要一个新的ViewHolder。