2011-11-20 19 views
1

我認爲這個問題值得一讀,在我看來......我試圖詳細解釋,但是爲了減輕閱讀難度。無法弄清楚爲什麼背景顏色在滾動時會出現不規則的行爲ListView

  1. 我有一個自定義CursorAdapter填充的ListView

  2. bindView()方法中,我嘗試設置孩子的顏色。

  3. 這個孩子是LinearLayout,這是用於列表中項目的根佈局。它在XML文件R.layout.list_item中,在自定義CursorAdapter的newView()方法中誇大。

  4. 我使用下面的代碼設置背景顏色。

    LinearLayout root = (LinearLayout) view.findViewById(R.id.list_item_root); 
    // ... 
    if (isEvenDay(cal)) { 
        tvDate.setText(tvDate.getText() + " *"); 
        root.setBackgroundColor(Color.DKGRAY); 
    } 
    

不要擔心的,如果塊什麼以外setBackgroundColor。你會看到的。

預期行爲:有些孩子會被塗上DKGRAY,並且會將*附加到某個textView。其他人將是默認顏色,並沒有這個*。我使用這個*標籤只是爲了確保它不是(直接)我的代碼。

行爲:當ListView最初顯示時,它看起來很好,如預期的那樣。當我滾動列表時,它會變得「怪異」(我不明白),有些孩子會開始改變顏色,直到所有的孩子都被塗上了顏色爲DKGRAY

現在,最糟糕的是,這個工程:

LinearLayout root = (LinearLayout) view.findViewById(R.id.list_item_root); 
    // ... 
    if (isEvenDay(cal)) { 
     tvDate.setText(tvDate.getText() + " *"); 
     root.setBackgroundColor(Color.DKGRAY); 
    } else { 
     root.setBackgroundColor(Color.GRAY); 
    } 

正確的兒童得到畫DKGRAY和灰色,並滾動列表不會榜上無名顏色去瘋狂。顏色不會改變,一切似乎都沒問題。當然,除了DKGRAY和GRAY之外,我想要DKGRAY,讓其他孩子獨自一人。 ¬¬

請幫幫我!


下面的圖片。查看第一列中的*如何在不同日期之間正常工作,但顏色沒有。

1 - 我開始滾動,有的孩子已經有缺陷:

enter image description here

2 - 我完成上下滾動,並最終所有的孩子是有缺陷的:

enter image description here

3 - 但是當我爲所有孩子設置顏色時,滾動不會將其擰緊:

enter image description here

+0

我懷疑這個whooooole問題可能很簡單。但是當你無法弄清楚的時候,你無法想象它...... – davidcesarino

回答

2

爲了不創建大量的內存視圖並導致大量的分配和垃圾回收,bindView會給你一個'回收'的視圖,在滾動大列表時已經被使用。這個視圖將具有上次使用它時發生的任何屬性。因此,您需要明確設置所有這些屬性。

所以,如果有時候你想讓它變成灰色,有時你想讓它變成白色,那麼你需要始終將它設置爲一個或另一個。沒有可以依賴的「默認」。

+1

大多數佈局的默認值爲null。如果你想將行切換到透明狀態,請嘗試'setBackgroundDrawable(null)'。 – adamp

+0

謝謝你們兩位!我需要這一點,知道我不能依靠默認設置,而且它確實是預期的。 – davidcesarino

相關問題