2010-10-24 106 views
5

我正在處理一個ListActivity,它將顯示一堆數字(權重)。我想改變ListView中特定行的背景。爲此,我創建了ArrayAdapter類的自定義實現,並重寫了getView方法。該適配器接受一個數字列表,並將數字20的行的背景設置爲黃色(爲了簡單起見)。getView中的自定義ArrayAdapter setBackground

public class WeightListAdapter extends ArrayAdapter<Integer> { 

    private List<Integer> mWeights; 

    public WeightListAdapter(Context context, List<Integer> objects) { 
     super(context, android.R.layout.simple_list_item_1, objects); 

     mWeights = objects; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = super.getView(position, convertView, parent); 

     int itemWeight = mWeights.get(position); 
     if (itemWeight == 20) { 
      v.setBackgroundColor(Color.YELLOW); 
     } 
     return v; 
    } 

} 

的問題是,不僅與數20行得到黃色背景,但也與數字0(第一行即是)行,我不知道爲什麼會這樣。

我在getView方法中做了什麼錯誤(如調用超級方法)?我推理的實現是:所有返回的視圖應該是相同的(這就是爲什麼我叫超級方法)只有符合if條件的視圖應該被改變。

感謝您的幫助!

回答

3

我做了一些研究,以瞭解如何正確完成這項工作。

我正在爲其他人寫下這個問題,因爲我猜這是怎麼做的正確方法。請讓我知道,如果我錯了,或者這個解決方案有什麼缺陷我沒有看到。

public class WeightListAdapter extends ArrayAdapter<Integer> { 

    private static final int TYPE_COUNT = 2; 
    private static final int TYPE_ITEM_COLORED = 1; 
    private static final int TYPE_ITEM_NORMAL = 0; 

    public WeightListAdapter(Context context, List<Integer> objects) { 
    super(context, android.R.layout.simple_list_item_1, objects); 
    } 

    @Override 
    public int getViewTypeCount() { 
    return TYPE_COUNT; 
    } 

    @Override 
    public int getItemViewType(int position) { 
    int item = getItem(position); 

    return (item == 30) ? TYPE_ITEM_COLORED : TYPE_ITEM_NORMAL; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    View v = super.getView(position, convertView, parent); 
    switch (getItemViewType(position)) { 
    case TYPE_ITEM_COLORED: 
     v.setBackgroundColor(Color.YELLOW); 
     break; 
    case TYPE_ITEM_NORMAL: 
     break; 
    } 

    return v; 

    } 
} 

顯然基類已經實現了邏輯確保正確convertView傳遞給getView方法(基於getViewItemTypegetViewTypeCount方法)。

1

Android的視圖是爲每一行重新使用一個組件。我也遇到了這個問題。

+0

我明白了。這是有道理的,是的。所以現在的問題是解決這個問題的最好方法是什麼。切換convertView或設置兩個樣式屬性,如果結束其他,選項? – Igor 2010-10-24 15:27:08

1

如果是因爲重用,爲什麼不添加另一個檢查是否itemWeight不等於20?如果不相等,則將背景設置恢復正​​常。

+0

是的,我想過,但我做了一些研究並找到了另一種解決方案。 – Igor 2010-10-25 22:04:39

相關問題