為什么Tag要在Adapter里面設(shè)置
你們不覺(jué)得那個(gè)設(shè)置tag的有問(wèn)題嗎?在adapter里面設(shè)置了tag,去到ImageLoader里面又去判斷是否對(duì)應(yīng)? 你前一秒中剛為這個(gè)ImageView設(shè)置了tag“A”,去到那邊又判斷ImageView.getTag()是否等于“A”?
你們不覺(jué)得那個(gè)設(shè)置tag的有問(wèn)題嗎?在adapter里面設(shè)置了tag,去到ImageLoader里面又去判斷是否對(duì)應(yīng)? 你前一秒中剛為這個(gè)ImageView設(shè)置了tag“A”,去到那邊又判斷ImageView.getTag()是否等于“A”?
舉報(bào)
2016-07-25
因?yàn)槟阍诓粩嗷瑒?dòng)ListView的過(guò)程中,View復(fù)用會(huì)導(dǎo)致你的列表出現(xiàn)錯(cuò)位的情況,所以會(huì)給ImageView設(shè)置一個(gè)Tag,mImageView.setTag(url)。也就是說(shuō)這個(gè)url只能和mImageView匹配。
private Handler mMainHandler = new Handler(Looper.getMainLooper()) {
? ?@Override
? ?public void handleMessage(Message msg) {
? ? ? ?//對(duì)象開(kāi)始傳入主線程中,開(kāi)始處理
? ? ? ?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) {
? ? ? ? ? ? ? ?//將對(duì)應(yīng)的imageView,url,bitmap封裝成一個(gè)對(duì)象,然后將對(duì)象傳入Handler
? ? ? ? ? ? ? ?LoaderResult result = new LoaderResult(imageView, urlString, bitmap);
? ? ? ? ? ? ? ?mMainHandler.obtainMessage(MESSAGE_POST_RESULT, result).sendToTarget();
? ? ? ? ? ?}
? ? ? ?}
? ?};
? ?THREAD_POOL_EXECUTOR.execute(loadBitmapTask);
}
LoaderResult對(duì)象對(duì)應(yīng)的ImageView, url, Bitmap。我在showImageByThreads方法中將該對(duì)象傳入Handler,
問(wèn)題就出在,你滑動(dòng)的過(guò)程中中,有可能ImageView和url不對(duì)應(yīng)了,所以需要判斷下,
String url = ImageView.getTag(); // 這是和ImageView對(duì)應(yīng)的url。我們之前設(shè)置的。
LoaderResult對(duì)象的url,是我們傳遞過(guò)去的。有可能這個(gè)會(huì)改變。
說(shuō)了不是很清楚,但是意思,就是這樣的。