2013-09-30 28 views
1

我下面從developer.android.com "Making ListView Scrolling Smooth"如何使用AsyncTask判斷項目是否在listview中被回收?

文章代碼的片段是:

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中的位置。但它不起作用。

而且我也找到了與之相似的代碼來執行異步任務 「Multithreading For Performance」, 它用「WeakReference的」判斷該項目是否存在。 兩種方式是否同樣有效?

回答

1

當適配器回收視圖時,位置改變。這是由框架自動發生的,直到你檢查了值之後你纔會知道它發生了。上次視圖交給getView()時設置的自定義ViewHolder對象仍然存在,所以它是一個方便的地方來跟蹤工作開始時的位置。如果它們不匹配,View已被回收,所以不應該設置位圖,因爲它是錯誤的。

+0

謝謝。所以我應該設置一個類變量mPosition。讓mPosition =在getView()中的位置。讓viewHolder.position = getView()中的位置。在onPostExecute中,我將檢查viewHolder.position == mPosition。但是,這不起作用。請告訴我,我的上述邏輯是錯誤的。 – user1914692

+0

你的意思是「這不起作用」是什麼意思? – Krylez

+0

在我的列表中有4項。只有最後一項顯示圖標。其實我認爲mPosition會在適配器逐一訪問項目時發生變化。所以當4個項目在列表視圖中時,第一個項目仍然在執行異步任務,但getView導航到第二個項目。 – user1914692

相關問題