为什么Tag要在Adapter里面设置
你们不觉得那个设置tag的有问题吗?在adapter里面设置了tag,去到ImageLoader里面又去判断是否对应? 你前一秒中刚为这个ImageView设置了tag“A”,去到那边又判断ImageView.getTag()是否等于“A”?
你们不觉得那个设置tag的有问题吗?在adapter里面设置了tag,去到ImageLoader里面又去判断是否对应? 你前一秒中刚为这个ImageView设置了tag“A”,去到那边又判断ImageView.getTag()是否等于“A”?
2016-07-24
因为你在不断滑动ListView的过程中,View复用会导致你的列表出现错位的情况,所以会给ImageView设置一个Tag,mImageView.setTag(url)。也就是说这个url只能和mImageView匹配。
private Handler mMainHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
//对象开始传入主线程中,开始处理
LoaderResult result = (LoaderResult) msg.obj;
ImageView imageView = result.imageView;
String url = (String) imageView.getTag();
if (url.equals(result.url)) {
imageView.setImageBitmap(result.bitmap);
} else {
Log.d("gy", "when set image bitmap, but url has changed!");
}
}
};
public void showImageByThreads(final ImageView imageView, final String urlString) {
Runnable loadBitmapTask = new Runnable() {
@Override
public void run() {
imageView.setTag(urlString);
Bitmap bitmap = loadBitmap(urlString);
if (bitmap != null) {
//将对应的imageView,url,bitmap封装成一个对象,然后将对象传入Handler
LoaderResult result = new LoaderResult(imageView, urlString, bitmap);
mMainHandler.obtainMessage(MESSAGE_POST_RESULT, result).sendToTarget();
}
}
};
THREAD_POOL_EXECUTOR.execute(loadBitmapTask);
}
LoaderResult对象对应的ImageView, url, Bitmap。我在showImageByThreads方法中将该对象传入Handler,
问题就出在,你滑动的过程中中,有可能ImageView和url不对应了,所以需要判断下,
String url = ImageView.getTag(); // 这是和ImageView对应的url。我们之前设置的。
LoaderResult对象的url,是我们传递过去的。有可能这个会改变。
说了不是很清楚,但是意思,就是这样的。
举报