2011-04-20 60 views
2

我正在使用ListView和自定義對象膨脹到getView方法中。Android ListView正在回收仍在屏幕上的項目

我的問題開始於ListView觸發onItemClicked事件時,它重新繪製項目。

這不是問題。實際問題出現是因爲我正在回收getView給我的項目。

在我進入之前,下面是我使用的代碼。

public View getView(int position, com.abc.rxcard.Item itemAtPosition, 
     View convertView, ViewGroup parent) { 
    LinearLayout thisItem; 
    //Get the current alert object 

    //Inflate the view 
    if(convertView==null) 
    { 
     thisItem = new LinearLayout(this); 
     String inflater = Context.LAYOUT_INFLATER_SERVICE; 
     LayoutInflater vi; 
     vi = (LayoutInflater)this.getSystemService(inflater); 
     vi.inflate(R.layout.offerrow, thisItem, true); 
    } 
    else 
    { 
     thisItem = (LinearLayout) convertView; 
    } 

    Log.d("thisItem","This Item is Index " + position + " " + thisItem.toString() + " " + Integer.toHexString(System.identityHashCode(thisItem))); 


    //Get the text boxes from the listitem.xml file 
    TextView caption =(TextView)thisItem.findViewById(R.id.caption); 
    TextView subText =(TextView)thisItem.findViewById(R.id.subText); 
    ImageView icon = (ImageView)thisItem.findViewById(R.id.offerIcon); 

    //Assign the appropriate data from our alert object above 
    caption.setText(itemAtPosition.text()); 
    subText.setText(itemAtPosition.subText()); 
    MyUtils.setImageFromURLInBackgroundThread(icon, itemAtPosition.icon()); 


    return thisItem; 
} 

當我點擊物品時出現問題。 日誌輸出如下

04-20 14:36:28.402: DEBUG/thisItem(12495): This Item is Index 0 [email protected] 44db1c50 
04-20 14:36:28.432: DEBUG/thisItem(12495): This Item is Index 1 [email protected] 44da9038 
04-20 14:36:28.442: DEBUG/thisItem(12495): This Item is Index 2 [email protected] 44d2ee48 
04-20 14:36:28.932: DEBUG/thisItem(12495): This Item is Index 0 [email protected] 44d2ee48 
04-20 14:36:28.952: DEBUG/thisItem(12495): This Item is Index 1 [email protected] 44da9038 
04-20 14:36:28.962: DEBUG/thisItem(12495): This Item is Index 2 [email protected] 44db1c50 
04-20 14:36:29.622: DEBUG/thisItem(12495): This Item is Index 0 [email protected] 44db1c50 
04-20 14:36:29.652: DEBUG/thisItem(12495): This Item is Index 1 [email protected] 44da9038 
04-20 14:36:29.662: DEBUG/thisItem(12495): This Item is Index 2 [email protected] 44d2ee48 

正如你所看到的索引0和2翻動的物品來回。如果這些項目實際上不在屏幕上,現在這不是問題。但是,當我點擊這些項目(並且因爲圖像是在後臺線程中加載的),項目1和項目3上的圖像會在每次點擊時來回翻轉。

這似乎是一個不好的行爲。
我不確定在世界上做什麼,解決問題。有沒有設置或什麼,我可以把ListView阻止它這樣做?

回答

3

事實證明,回收商正在經歷我所有的物品,並將它們放入廢料堆中,因爲它將刷新其運行週期。我遇到的問題是因爲它以相反的順序遍歷項目,我應該理所當然地需要擦除該對象,然後再次設置其值。

我對這個問題的解決方法是緩存我下載到指定位置的磁盤至少一分鐘的圖像。當刷新發生時,它會嘗試從緩存中加載圖像,而不是每次都下載。並且只會在圖像過期時下載。從而將圖像立即替換爲需要的圖像,而不是保留現有的廢料圖像。

我正面臨的問題得到了解決,但事實仍然是,他們回收屏幕上的項目....很難相信在一個項目上點擊整個ListView將被刷新,所有項目將被重新創建。但這是餅乾崩潰的方式,當你在java中蘸... ...

0

我以前有同樣的問題。

我認爲這個問題是與你的背景圖像線程下載。如果滾動列表視圖的速度非常快,並且由於同一行視圖會一遍又一遍地重複使用,可能會讓所有這些圖像嘗試下載到相同的「圖標」圖像視圖,並將圖像置於頂部的另一個,這產生了來回切換圖像的效果。

我的解決方案是在調用圖像下載器之前在圖標圖像視圖上設置具有唯一標識符的標籤。例如說:

icon.setTag(imageUrl); 

MyUtils.setImageFromURLInBackgroundThread(icon, itemAtPosition.icon(), imageUrl); 

而且你setImageFromURLInBackgroundThread()方法中,當你完成線程下載圖像,檢查圖標視圖以查看是否在下載URL設置的圖標圖像視圖前IMAGEURL匹配。例如:

if (icon.getTag() != null) { 
    viewTagUrl = String.valueOf(icon.getTag()); 
} 

if(imageUrl.equalsIgnoreCase(viewTagUrl)) { 
    icon.setImageBitmap(bitmap); 
} 

此外,由於圖像下載有時需要一段時間,我也清理圖像視圖和運行的線程下載圖像之前設置的默認圖像。

icon.setImageBitmap(null); 
icon.setImageResource(defaultImage); 
... 
downloadThread.start(); 
相關問題