holder.position = position; new ThumbnailTask(position,holder) .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,null);
ThumbnailTask构造函数是:
public ThumbnailTask(int position,ViewHolder holder) { mPosition = position; mHolder = holder; }
在onPostExecute()中,然后他执行前面提到的检查:
if (mHolder.position == mPosition) { mHolder.thumbnail.setImageBitmap(bitmap); }
我只是看不出这会给出任何结果. Holder和position在构造函数中同时设置为相同的值(holder中的位置与mPosition中的位置相同).它们在AsyncTask期间不会被更改(确实位置可能在getView()中发生变化,但是作为私有成员存储在AsyncTask中的那些永远不会被操纵).我在这里想念的是什么?
同时保存位置似乎不是一个好的选择:我相信它不能保证是唯一的,如果我没记错,它会在滚动后重置为0.我在想正确的方向吗?
解决方法
当ListView需要一个新的视图来显示时,它调用适配器的getView并使用整数参数“position”来指示它想要看到的适配器集合中的哪个对象(位置只是从1到N -1的数字),其中N是适配器中的对象数.
如果它有任何不再可见的视图,它也会将其中一个传递给适配器,因为“convertView”这表示“重用这个旧视图而不是创建一个新视图”.一场巨大的表现胜利.
本文中的代码将ViewHolder对象附加到它创建的每个视图,其中包含ListView请求的对象的位置.在文章的代码中,这个位置被隐藏在ViewHolder中,同时指向视图中将包含图像的字段. ViewHolder作为标记(单独的主题)附加到View.
如果视图被回收以容纳不同的对象(在不同的位置),那么ListView将调用Adapter.getView(newPosition,oldView …).文章中的代码将新位置存储到附加到oldView的ViewHolder中. {到目前为止有道理?)并开始加载这个新图像以放入视图.
现在在文章中,它启动了一个AsyncTask来检索应该进入视图的数据.这个任务有位置(来自getView调用)和holder(来自oldView).该位置告诉它请求了哪些数据.持有人告诉它该视图中当前应该显示哪些数据以及一旦显示它就放在哪里.
如果在AsyncTask仍在运行时视图再次被回收,则持有者中的位置将被更改,因此这些数字将不匹配,并且AsyncTask知道不再需要它的数据.
这会让它更清晰吗?