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