2013-05-26 39 views
1

如何在展開式視圖中爲單個組名稱設置不同的背景顏色?Android展開式列表爲單個組設置背景顏色

我有跟團的名稱創建組碼 - 組1至10組,每組有孩子 - 孩子1至3兒童

我想給基於不同的背景顏色給每個組與其子在組名上。如果條件不符合則默認爲黑色。
例如:
集團 1 - 白色背景
集團 2 - 紅色背景
第3族 - 灰色背景
集團 4 - 黃色背景

main.xml中:擴展列表佈局

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 

     <ExpandableListView 
      android:id="@+id/expandable_list" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 

     <ListView 
      android:id="@+id/android:list" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:choiceMode="multipleChoice" /> 

</LinearLayout> 

grouprow.xml: group text layout

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <TextView android:id="@+id/rowname" 
     android:paddingLeft="50px" 
     android:textSize="30px" 
     android:textColor="@drawable/blue" 
     android:textStyle="normal" 
     android:layout_width="fill_parent" 
     android:layout_height="50px"/> 

</LinearLayout> 

childrow.xml:子文本佈局

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 

    <TextView android:id="@+id/grpchild" 
     android:paddingLeft="50px" 
     android:focusable="false" 
     android:textSize="14px" 
     android:textStyle="normal" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 

</LinearLayout> 

父組類:類來創建每個父項

public class CategoryGroup { 
     private String mTitle; 
     private ArrayList<String> mArrayChildren; 

     public String getTitle() { 
      return mTitle; 
     } 

     public void setTitle(String mTitle) { 
      this.mTitle = mTitle; 
     } 

     public ArrayList<String> getArrayChildren() { 
      return mArrayChildren; 
     } 

     public void setArrayChildren(ArrayList<String> mArrayChildren) { 
      this.mArrayChildren = new ArrayList(mArrayChildren); 
     } 
} 

擴展列表類:

public class ExpandableListItems extends BaseExpandableListAdapter { 

      private LayoutInflater inflater; 
      private ArrayList<CategoryGroup> mParent; 

      public ExpandableListItems(Context context, ArrayList<CategoryGroup> parent) { 
       mParent = parent; 
       inflater = LayoutInflater.from(context); 
      } 


      @Override 
      //counts the number of group/parent items so the list knows how many times calls getGroupView() method 
      public int getGroupCount() { 
       return mParent.size(); 
      } 

      @Override 
      //counts the number of children items so the list knows how many times calls getChildView() method 
      public int getChildrenCount(int i) { 
       return mParent.get(i).getArrayChildren().size(); 
      } 

      @Override 
      //gets the title of each parent/group 
      public Object getGroup(int i) { 
       return mParent.get(i).getTitle(); 
      } 

      @Override 
      //gets the name of each item 
      public Object getChild(int i, int i1) { 
       return mParent.get(i).getArrayChildren().get(i1); 
      } 

      @Override 
      public long getGroupId(int i) { 
       return i; 
      } 

      @Override 
      public long getChildId(int i, int i1) { 
       return i1; 
      } 

      @Override 
      public boolean hasStableIds() { 
       return true; 
      } 

      @Override 
      //in this method you must set the text to see the parent/group on the list 
      public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) { 

       if (view == null) { 
        System.out.println("i: " + i + "; b: " + b); 
        view = inflater.inflate(R.layout.grouprow, viewGroup, false); 
       } 


       TextView textView = (TextView) view.findViewById(R.id.rowname); 

       //"i" is the position of the parent/group in the list 

       textView.setText(getGroup(i).toString()); 

       //return the entire view 
       return view; 
      } 

      @Override 
      //in this method you must set the text to see the children on the list 
      public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) { 
       if (view == null) { 
        view = inflater.inflate(R.layout.childrow, viewGroup, false); 
       } 

       TextView textView = (TextView) view.findViewById(R.id.grpchild); 
       //"i" is the position of the parent/group in the list and 
       //"i1" is the position of the child 
       textView.setText(mParent.get(i).getArrayChildren().get(i1)); 

       //return the entire view 
       return view; 
      } 

      @Override 
      public boolean isChildSelectable(int i, int i1) { 
       return true; 
      } 

      @Override 
      public void registerDataSetObserver(DataSetObserver observer) { 
       /* used to make the notifyDataSetChanged() method work */ 
       super.registerDataSetObserver(observer); 
      } 
} 

主要活動類:

public class GetResourcesListActivity extends ListActivity { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     private ExpandableListView mExpandableList; 
     private ExpandableListItems mAdapter; 
     ArrayList<CategoryGroup> arrayParentsGroups = new ArrayList<CategoryGroup>(); 

     mExpandableList = (ExpandableListView)findViewById(R.id.expandable_list); 
     arrayParents = createGroupList(); 

     mAdapter = new ExpandableListItems(this, arrayParentsGroups); 
     mExpandableList.setAdapter(mAdapter); 

     private List createGroupList() { 
      ArrayList arrayParents = new ArrayList(); 
      for(int i = 0 ; i < 10 ; ++i) { // 10 groups........ 
       CategoryGroup parent = new CategoryGroup(); 
       parent.setTitle("Group" + i); 

       ArrayList<String> arrayChildren = new ArrayList<String>(); 
       for (int j = 0; j < 3; j++) { 
        arrayChildren.add("Child " + j); 
       } 
       parent.setArrayChildren(arrayChildren); 
       arrayParents.add(parent); 
      } 
      return arrayParents; 
     } 
    } 
) 

回答

1

一個簡單的方法來做到這一點如下。

給你的CategoryGroup另一個屬性叫做int mBackgroundRes。還要添加相應的getter和setter方法。

在你createGroupList()方法您將針對您的邏輯背景資源:

private ArrayList<CategoryGroup> createGroupList() { 
    ArrayList arrayParents = new ArrayList(); 
    for (int i = 0; i < 10; ++i) { // 10 groups........ 
     CategoryGroup parent = new CategoryGroup(); 
     parent.setTitle("Group" + i); 

     int background = android.R.color.black; 
     if (i == 0) { 
      background = android.R.color.white; 
     } else if (i == 1) { 
      background = android.R.color.holo_red_light; 
     } else if (i == 2) { 
      background = android.R.color.darker_gray; 
     } 
     parent.setBackgroundRes(background); 

     ArrayList<String> arrayChildren = new ArrayList<String>(); 
     for (int j = 0; j < 3; j++) { 
      arrayChildren.add("Child " + j); 
     } 
     parent.setArrayChildren(arrayChildren); 
     arrayParents.add(parent); 
    } 
    return arrayParents; 
} 

最後,在BaseExpandableListAdapter變化getGroup()方法返回正確的對象類型。你可以簡單的改變ObjectCategoryGroup

@Override 
public CategoryGroup getGroup(int i) { 
    return mParent.get(i); 
} 

,並設置無論在getGroupView()getChildView()方法各自的看法背景:

@Override 
public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) { 

    if (view == null) { 
     System.out.println("i: " + i + "; b: " + b); 
     view = inflater.inflate(R.layout.grouprow, viewGroup, false); 
    } 

    view.setBackgroundResource(getGroup(i).getBackgroundRes()); 

    TextView textView = (TextView) view.findViewById(R.id.rowname); 
    textView.setText(getGroup(i).getTitle()); 

    return view; 
} 

@Override 
public View getChildView(int i, int i1, boolean b, View view, 
     ViewGroup viewGroup) { 

    if (view == null) { 
     view = inflater.inflate(R.layout.childrow, viewGroup, false); 
    } 

    view.setBackgroundResource(getGroup(i).getBackgroundRes()); 

    TextView textView = (TextView) view.findViewById(R.id.grpchild); 
    textView.setText(mParent.get(i).getArrayChildren().get(i1)); 

    return view; 
} 
+0

謝謝JensIts工作得很好。除了背景之外,我還可以在每個組行的文本旁添加圖像? (而不是兒童)。對於每個組行,我都有不同的圖像。 – Kranthi

0

更新您的適配器是這樣的:

@Override 
    //in this method you must set the text to see the parent/group on the list 
    public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) { 

      if (view == null) { 
       System.out.println("i: " + i + "; b: " + b); 
       view = inflater.inflate(R.layout.grouprow, viewGroup, false); 
       switch(i){ // i is the groupPosition - 0-based indexing 
       case 0: view.setBackgroundColor(android.R.color.white); break; 
       case 1: view.setBackgroundColor(android.R.color.holo_dark_red); break; 
       ... 
       } 
      } 

      TextView textView = (TextView) view.findViewById(R.id.rowname); 
      //"i" is the position of the parent/group in the list 
      textView.setText(getGroup(i).toString()); 
      //return the entire view 
      return view; 
    } 

如果提供的顏色不夠(android.R.color.xxx),那麼你可以自己做。 創建一個新的文件在res /命名colors.xml然後定義自己的顏色值:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<color name="white">#FFFFFF</color> 
<color name="yellow">#FFFF00</color> 
<color name="red">#FF0000</color> 
<color name="gray">#808080</color> 
<color name="purple">#800080</color> 
<color name="green">#008000</color> 
<color name="blue">#0000FF</color> 
<color name="black">#000000</color> 
</resources> 

然後你可以參考他們在你的代碼是這樣的: view.setBackgroundColor(R.color.blue);

編輯:如果它不是用這種方式工作,用分辨的顏色嘗試一下吧: view.setBackgroundColor(getResources().getColor(android.R.color.white));

我剛貼上我自己的ExpandableListView並沒有問題。

+0

謝謝馬特。我試着完全一樣。但背景不設置。 – Kranthi