亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

為什么Tag要在Adapter里面設置

你們不覺得那個設置tag的有問題嗎?在adapter里面設置了tag,去到ImageLoader里面又去判斷是否對應? 你前一秒中剛為這個ImageView設置了tag“A”,去到那邊又判斷ImageView.getTag()是否等于“A”?

正在回答

1 回答

因為你在不斷滑動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,是我們傳遞過去的。有可能這個會改變。

說了不是很清楚,但是意思,就是這樣的。

0 回復 有任何疑惑可以回復我~
#1

丿M灬S灬N丨

你根本沒說清,你也沒理解對。 是convertView緩存機制 & 異步加載機制 兩者共同導致的。
2016-08-21 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
Android必學-異步加載
  • 參與學習       50616    人
  • 解答問題       333    個

了解Android中的異步加載處理方法,這是面試問的最多的知識點

進入課程

為什么Tag要在Adapter里面設置

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號