2011-05-23 58 views
1

我知道如何通過onitemclicklistener訪問列表視圖項目,但我該如何改變代碼中的背景顏色。如何引用列表視圖中的特定視圖

須藤代碼:

lv[0].setBackgroundResource(R.color.red); //change the background of the first listview item 

是否有訪問列表視圖的每個視圖的方法嗎?

回答

2

@Matt:這並不是說它很弱,你只需要瞭解它的工作方式。在任何時候,你的ListView只包含可見的項目,所以你不能直接訪問和更改項目。當它們從視圖中滾動出來時,視圖將被回收,並由ListAdapter填充數據。在這個適配器中,您需要處理項目應該不同的情況。如果您在getView()方法中創建了自己的自定義ListAdapter(例如ArrayAdapter,BaseAdapter),只需在其中添加一些邏輯來處理背景顏色應該更改的情況。

比方說,例如,你有一個整數列表,以及任何你想要的整數> = 50,以紅色顯示:

if(items.get(position) >= 50) { 
    myView.setBackgroundColor("#FF0000"); 
} else { 
    myView.setBackgroundColor("#000000"); 
} 

(以確保處理其他案件是很重要的,因爲您可能會看到一個紅色物品的回收視圖,在這種情況下,您必須將其重置爲您需要的任何默認背景顏色。)

如果您從未構建過自定義適配器,則可以使用this excerpt from CommonsWare's book在創建自定義ListAdapter是一個很好的資源。

編輯:進一步想,根據您的評論:

在您的自定義您的ListActivity

@Override 
protected void onListItemClick(ListView l, View v, int pos, long id) { 
    super.onListItemClick(l, v, pos, id); 
    ((CustomAdapter)l.getAdapter()).setLastSelectedObject(items.get(pos)); 
} 

ExpandableListAdapter

private Object lastSelectedObject; 

public void setLastSelectedObject(Object obj) { 
    lastSelectedObject = obj; 
} 

public Object getLastSelectedObject() { 
    return lastSelectedObject; 
} 

實施onListItemClick(ListView l, View v, int pos, long id)現在回到getView()

Object obj = getLastSelectedObject(); 
if(obj != null) { 
    //handle background switching for your View here 
} else { 
    //reset background to default for recycled views 
} 
+0

我有一個自定義listadapter(它實際上是一個自定義'expandableListAdapter')我有一個'getChildView'接收'groupPosition','childPosition','convertView'和'parentView'。問題是我需要根據最後點擊的子視圖來更改背景。我可以用這種方法粘貼某種'onclicklistener'嗎?另外,如何保存點擊哪個視圖?謝謝。 – yellavon 2011-05-25 18:21:01

+0

啊我明白了。我已經爲您添加了一些其他建議。基本上,向你的ListAdapter添加一個私有變量來跟蹤最後一個被點擊的項目(只需要替換你的項目類型是用於Object的)。然後,每當一個項目被點擊時,將其設置爲您最後選擇的項目。然後在你的'getView()'中,檢索這個對象,並根據它處理你的邏輯。 – kcoppock 2011-05-25 19:00:59

-1

Android中的ListView類很弱。

你的問題的簡短答案是否定的,不容易。

有人在Google I/O上詢問了這個問題,android團隊的答案是使用垂直填充的LinearLayout並添加一堆子視圖(基本上賦予其與ListView相同的功能) 。

你可以做getChild(x)用於獲得任何的意見

0

看一看this example

int first = view.getFirstVisiblePosition(); 
int count = view.getChildCount(); 
for (int i=0; i<count; i++) { 
    TextView t = (TextView)view.getChildAt(i); 
    if (t.getTag() != null) { 
     t.setText(mStrings[first + i]); 
     t.setTag(null); 
    } 
} 

似乎類似於getChildAt是你正在尋找的方法。

相關問題