1

如何在可展开视图中为各个组名设置不同的背景颜色?

我有使用组名创建组的代码 - 组 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:组文本布局

<?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;
        }
    }
)
4

2 回答 2

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()并在and方法中设置各自视图的背景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;
}
于 2013-05-26T20:46:13.377 回答
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/values 中创建一个名为 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,没有问题。

于 2013-05-26T20:47:55.703 回答