1

ExpandableListViewを使用していますが、子行にはそれぞれテキストビューとチェックボックスがあります。

私がやりたいのは、ユーザーがボタンを押すと、アクティビティはどのアイテムが「チェックされている」かを判断し、それらのアイテムを使って何かをすることです。

ExpandableListViewとチェックボックスが現在うまく機能していないこと、および選択されているものを追跡するために追加のデータ構造を保持する必要がある方法について、多くの投稿を読みました。この投稿はその問題をカバーしています: ExpandableListViewとチェックボックス

終わり!これで、何が選択され、何が選択されなかったかを追跡できます。

次に、チェックボックスの状態が表示されないという問題に取り組みたいと思います。次の場合にチェックボックスがランダムに変化することに気づきました。

  • 画面の回転が変化します
  • グループが崩壊/開く

私はこれらのイベントを検出することが可能であることを知っています。

チェックボックスを手動で設定する方法があるかどうか知りたいです。私は最初に試しました

ExpandableListView elv = getExpandableListView();
for(int i = 0; i < elv.getChildCount(); i++) {
  CheckBox checkbox = ... somehow get checbox within the list
  checkbox.setChecked(checkList.at(i, j));
}

ここで、iとjはどのグループと子を示し、checkListはチェックされた/チェックされていないアイテムを追跡します。

ただし、getChildCount()の値は、開いているグループの数に依存し、操作できるリスト項目を必ずしも教えてくれないことに気付きました。

ExpandableListViewが使用されており、誰かがこの問題を回避する方法を持っていたに違いありません。これに対する賢い解決策はありますか?具体的には、onGroupExpandおよびonConfigurationChange(または同様のイベント)のリストで適切な項目をチェック/チェック解除する方法を探しています。

前もって感謝します!

4

2 に答える 2

7

次のサンプル拡張可能リストアダプタを確認してください

/**
     * A simple adapter which maintains an ArrayList of photo resource Ids. 
     * Each photo is displayed as an image. This adapter supports clearing the
     * list of photos and adding a new photo.
     *
     */
    public class MyExpandableListAdapter extends BaseExpandableListAdapter {


        // Sample data set.  children[i] contains the children (String[]) for groups[i].
        private String[] groups = { "People Names", "Dog Names", "Cat Names", "Fish Names" };
        private String[][] children = {
                { "Arnold", "Barry", "Chuck", "David" },
                { "Ace", "Bandit", "Cha-Cha", "Deuce" },
                { "Fluffy", "Snuggles" },
                { "Goldy", "Bubbles" }
        };

        private ArrayList<ArrayList<Boolean>> checkboxStatus = new ArrayList<ArrayList<Boolean>>();

        public MyExpandableListAdapter() {
            int groupCount = groups.length;
            for(int i=0; i<groupCount; i++) 
            {
                int childCount = children[i].length;
                ArrayList<Boolean> childStatus = new ArrayList<Boolean>();
                for(int j=0; j<childCount; j++) {
                    childStatus.add(false);
                }
                checkboxStatus.add(childStatus);
            }
        }

        public Object getChild(int groupPosition, int childPosition) {
            return children[groupPosition][childPosition];
        }

        public long getChildId(int groupPosition, int childPosition) {
            return childPosition;
        }

        public int getChildrenCount(int groupPosition) {
            return children[groupPosition].length;
        }

        public TextView getGenericView() {

            // Layout parameters for the ExpandableListView
            AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT, 64);

            TextView textView = new TextView(ExpandableListCheckboxActivity.this);
            textView.setLayoutParams(lp);
            // Center the text vertically
            textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
            // Set the text starting position
            textView.setPadding(36, 0, 0, 0);
            return textView;
        }

        public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
                View convertView, ViewGroup parent) {

            CheckBox chkbox = new CheckBox(ExpandableListCheckboxActivity.this);
            chkbox.setTag("" + groupPosition + "," + childPosition);
            chkbox.setOnCheckedChangeListener(checkboxListener);
            chkbox.setText(children[groupPosition][childPosition]);

            chkbox.setChecked(checkboxStatus.get(groupPosition).get(childPosition));

            return chkbox;
        }

        public Object getGroup(int groupPosition) {
            return groups[groupPosition];
        }

        public int getGroupCount() {
            return groups.length;
        }

        public long getGroupId(int groupPosition) {
            return groupPosition;
        }

        public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
                ViewGroup parent) {
            TextView textView = getGenericView();
            textView.setText(getGroup(groupPosition).toString());

            return textView;
        }

        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;
        }

        public boolean hasStableIds() {
            return true;
        }

        private OnCheckedChangeListener checkboxListener = new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                String positions = buttonView.getTag().toString();
                int groupPosition = Integer.valueOf(positions.split(",")[0]);
                int childPosition = Integer.valueOf(positions.split(",")[1]);
                checkboxStatus.get(groupPosition).set(childPosition, isChecked);
            }
        };

    }
于 2012-05-24T11:45:52.210 に答える
0

行をクリックしたときに変更したいだけの場合:

elv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
    @Override
    public boolean onChildClick(ExpandableListView parent, View v,
            int groupPosition, int childPosition, long id) {
        CheckBox checkbox = (CheckBox) v.findViewById(r.id.yourcheckbox)
        checkbox.setChecked(checkList.at(groupPosition, childPosition));    
        return true;
    }
});
于 2012-05-24T11:31:28.673 に答える