2011-07-01 150 views
3

我有一個不尋常的問題,我的ListView。我目前有一個「deselectAll()」方法,它遍歷我的ListView中的項目,並將它們設置爲未選中(項目實現Checkable接口)。 「checked」變量得到正確更改(視圖報告爲未被檢查),但視覺指示器(在本例中爲背景更改)不顯示視圖爲未選中狀態(背景保持選中項目的顏色)。ListView項目背景不變

我循環,並通過我的列表視圖像取消所以(我還加我declerations):

private ListView vw_entryList; 

private void deselectAll() { 
    for (int i = 0; i < sAdapter.getCount(); i++) { 
     ((Entry)vw_entryList.getItemAtPosition(i)).setChecked(false); 
    } 
} 

的代碼爲我實現setChecked()如下:

public void setChecked(boolean checked) { 
    _checked = checked; 
    if (checked) { 
     setBackgroundResource(R.drawable.listview_checked); 
    } 
    else { 
     setBackgroundResource(R.drawable.listview_unchecked); 
    } 
    invalidate(); 
} 

應當注意當點擊這些項目時,它們在OnItemClickListener中的選中和未選中之間切換,並且這可以正常工作,具有背景更改和所有功能。用於切換的代碼非常相似:

public void toggle() { 
    _checked = !_checked; 
    setBackgroundResource(_checked ? 
      R.drawable.listview_checked : R.drawable.listview_unchecked); 
    invalidate(); 
} 

我能看到的唯一區別是在方法從名爲。在OnItemClickListener.onClick()方法中調用toggle(),而我的deselectAll()是從同一個類中的按鈕標準OnClickListener中調用的。 有沒有人有任何想法,爲什麼當我調用我的deselectAll()函數後,背景不會改變?

回答

1

嘗試完所有事情之後(感謝您的幫助Jarek),我找到了適用於我的目的的解決方案。不是在被點擊的視圖中隱式調用setChecked(),而是將其保留在ListView類中的setItemChecked()方法中。

我更新的代碼:

private void deselectAll() {   
    for (int i = 0; i < sAdapter.getCount(); i++) { 
     vw_entryList.setItemChecked(i, false); 
    } 
} 

我最好的猜測是,ListView知道其項目實施Checkable類,因此需要自己是所有項目操作的處理程序。沿着這些線的東西。如果任何人都可以更詳細地解釋爲什麼這個解決方案可以工作,而其他人不這樣做,那麼我會用答案和贊成來獎勵他們。

1

你有背景的自定義非標準顏色嗎?如果是這樣,你可以看看http://www.curious-creature.org/2008/12/22/why-is-my-list-black-an-android-optimization/ - 它歸結爲將你的列表的android:cacheColorHint屬性設置爲背景顏色。也許這會有所幫助。

後進一步討論編輯:

我認爲你需要調用getAdapter()notifyDataSetChanged()的列表,而不是無效()。 List的構建方式是依靠適配器來提供數據。你在做什麼實際上你有一個隱含的適配器 - Entry實際上保存在適配器中,並且通過設置檢查,你真的正在改變數據模型,但是如果你不調用notifyDataSetChanged(),那麼這個列表並不真的知道模型已經改變並且不會重新創建視圖(invalidate()將只重繪現有視圖)。

+0

背景是我從XML創建的狀態列表可繪。出於某種原因,我無法獲取state_checked狀態,因此我實現了一個可繪製的名爲listview_checked的單獨狀態列表,然後切換代碼中的資源。不幸的是,這個cacheColorHint屬性並沒有影響任何東西,鏈接是一個很好的閱讀,但我認爲與我的問題無關。這很讓人困惑,因爲更改onItemClickListener中的可繪製背景工作正常。儘管感謝有趣的鏈接。 –

+0

我想你會做的更好,然後通過不改變背景,但通過簡單地添加一個「選中的顏色」「fill_parent」視圖到您的列表項目,並使其狀態變爲可選/不可見狀態時更改爲選中/取消選中 –

+0

即使在此更改後(VISIBLE/INVISIBLE切換),視圖不會改變背景。嗯,我會繼續努力。 –