【问题标题】:Android Expandable list Set background color to individual groupAndroid可扩展列表将背景颜色设置为单个组
【发布时间】:2013-05-26 19:48:52
【问题描述】:

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

我有使用组名创建组的代码 - 组 1 到组 10。每个组都有孩子 - 孩子 1 到孩子 3。

我想根据组名为每个组及其子项赋予不同的背景颜色。如果条件不满足,则默认为黑色。
示例:
第 1 组 - 白色背景
第 2 组 - 红色背景
第 3 组 - 灰色背景
第 4 组 - 黄色背景

ma​​in.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);
            }
}

主 Activity 类:

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

【问题讨论】:

    标签: android android-listview


    【解决方案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() 方法以返回正确的对象类型。您可以简单地将Object 更改为CategoryGroup

    @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;
    }
    

    【讨论】:

    • 感谢 Jens,它工作得很好。除了背景之外,我还可以在每个组行的文本旁边添加图像吗? (不给孩子)。每个组行都有不同的图像。
    【解决方案2】:

    将您的适配器更新为以下内容:

        @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 中,没有问题。

    【讨论】:

    • 谢谢马特。我试过完全一样。但背景没有设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2013-08-04
    • 2020-09-19
    • 2011-11-09
    • 2011-11-30
    相关资源
    最近更新 更多