【问题标题】:Why does collapsing an ExpandableListView group uncheck my CheckBoxes?为什么折叠 ExpandableListView 组会取消选中我的复选框?
【发布时间】:2012-02-27 03:06:43
【问题描述】:

我有一个由 BaseExpandableListAdapter 支持的 ExpandableListView。子列表项都是 CheckBox。

我展开一个组,选中一个复选框,然后折叠该组。然后取消选中该复选框。

我的日志输出是:

-- I check the checkbox:
02-27 13:51:29.674: D/ExpandableListAdapter(3583): Option '2' CHECKED
--- I collapse the group, which unchecks the checkbox:
02-27 13:51:30.850: D/ExpandableListAdapter(3583): Option '2' UNCHECKED

如您所见,折叠组正在(可能间接地)在该组中的所有复选框上调用我的 OnCheckedChangedListener。

我的代码是:

public class TestExpandableListActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ExpandableListView elv = 
            (ExpandableListView) findViewById(R.id.optionsELV);
        ExpandableListAdapter ela = new ExpandableListAdapter(this);
        elv.setAdapter(ela);
    }
    public class ExpandableListAdapter extends BaseExpandableListAdapter {
        private static final String TAG = "ExpandableListAdapter";
        private final String[] groups;
        private final String[][] children;
        private final boolean[][] childrenChecked;
        private final Context context;
        public ExpandableListAdapter(Context c) {
            this.context = c;
            groups = new String[] { "Options A", "Options B" };
            children = 
                new String[][] {{"A", "B", "C"},{"1", "2", "3"}};
            childrenChecked = 
                new boolean[][] {{false, false, false},{false, false, false}};
        }
        public View getChildView(
                final int groupPos, 
                final int childPos,
                boolean isLastChild, 
                View convertView, 
                ViewGroup parent) {
            CheckBox cb = new CheckBox(context);
            cb.setText(children[groupPos][childPos]);
            cb.setChecked(childrenChecked[groupPos][childPos]);
            cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                public void onCheckedChanged(
                        CompoundButton buttonView, 
                        boolean isChecked) {
                    Log.d(TAG, 
                            String.format("Option '%s' %s", 
                                    children[groupPos][childPos], 
                                    isChecked ? "CHECKED" : "UNCHECKED"));
                    childrenChecked[groupPos][childPos] = isChecked;
                }
            });
            return cb;
        }
        public int getGroupCount() {
            return groups.length;
        }
        public int getChildrenCount(int groupPos) {
            return children[groupPos].length;
        }
        public String getGroup(int groupPos) {
            return groups[groupPos];
        }
        public String getChild(int groupPos, int childPos) {
            return children[groupPos][childPos];
        }
        public long getGroupId(int groupPos) {
            return (1024 * (groupPos + 1));
        }
        public long getChildId(int groupPos, int childPos) {
            return (1024 * (groupPos + 1)) + (childPos + 1);
        }
        public View getGroupView(
                int groupPos, 
                boolean isExpanded, 
                View convertView, 
                ViewGroup parent) {
            TextView tv = new TextView(context);
            tv.setText(groups[groupPos]);
            return tv;
        }
        public boolean hasStableIds() {
            return true;
        }
        public boolean isChildSelectable(int groupPos, int childPos) {
            return true;
        }
    }
}

我的布局(请注意,我已将choiceMode 正确设置为multipleChoice)是:

<?xml version="1.0" encoding="utf-8"?>
<ExpandableListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/optionsELV"
    android:choiceMode="multipleChoice"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

为什么折叠一个组会取消选中我的所有复选框?我怎样才能防止这种情况发生?

【问题讨论】:

    标签: android android-listview


    【解决方案1】:

    我想我找到了解决方案 - 使用 CheckedTextView 而不是 CheckBox。

    public View getChildView(
            final int groupPos, 
            final int childPos,
            boolean isLastChild, 
            View convertView, 
            ViewGroup parent) {
        final CheckedTextView ctv = new CheckedTextView(context);
        ctv.setChecked(childrenChecked[groupPos][childPos]);
        ctv.setCheckMarkDrawable(
                ctv.isChecked()
                ? android.R.drawable.checkbox_on_background 
                : android.R.drawable.checkbox_off_background);
        ctv.setText(children[groupPos][childPos]);
        ctv.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                ctv.toggle();
                Log.d(TAG, 
                    String.format("Option '%s' %s", 
                        children[groupPos][childPos], 
                        ctv.isChecked() ? "CHECKED" : "UNCHECKED"));
                childrenChecked[groupPos][childPos] = ctv.isChecked();
                ctv.setCheckMarkDrawable(
                        ctv.isChecked() 
                        ? android.R.drawable.checkbox_on_background 
                        : android.R.drawable.checkbox_off_background);
            }
        });
        return ctv;
    }
    

    CheckedTextView 文档确实说 CheckedTextView 在 ListView 中是有用的——“当它的 setChoiceMode 设置为 CHOICE_MODE_NONE 以外的其他值的 ListView 中使用时,这很有用”——但我非常不清楚 CheckBox 和 CheckedTextView 之间有什么区别,以及为什么 CheckBox 似乎完全不起作用。

    谁能告诉我 CheckBox 和 CheckedTextView 之间有什么区别,以及为什么 CheckBoxes 在 ExpandableListView 中的功能如此奇怪?

    【讨论】:

    • 即使在选中的文本视图中,如果您折叠或展开文本视图,切换列表其余部分的随机更改,您是否遇到过这样的问题?
    【解决方案2】:

    我遇到了同样的问题。我不能告诉你为什么,但是移动、展开和折叠 ExpandableListView 的片段会导致复选框有时会被取消选中。

    解决此问题的更简单方法是对 CheckBox 使用 OnClickListener 事件而不是 OnCheckedChange。

    很烦

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多