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()、正しいオブジェクト タイプを返します。次のように簡単に変更できObjectますCategoryGroup

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

getGroupView()andgetChildView()メソッドの両方で、それぞれのビューに背景を設定します。

@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 に答える