作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个由 BaseExpandableListAdapter 支持的 ExpandableListView。子列表项都是复选框。
我展开一个组,选中一个复选框,然后折叠该组。然后取消选中该复选框。
我的日志输出是:
-- 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" />
为什么折叠组会取消选中我的所有复选框?我怎样才能防止这种情况发生?
最佳答案
我想我找到了解决方案 — 使用 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 doco 确实说 CheckedTextView 在 ListView 中有用——“这在 ListView 中使用时很有用,因为它的 setChoiceMode 已设置为除 CHOICE_MODE_NONE 之外的其他东西”——但我非常不清楚 CheckBox 和 CheckedTextView 之间的区别,以及为什么 CheckBox 似乎完全不起作用。
谁能告诉我 CheckBox 和 CheckedTextView 之间的区别是什么,以及为什么 CheckBox 在 ExpandableListView 中的功能如此奇怪?
关于android - 为什么折叠 ExpandableListView 组会取消选中我的复选框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9459546/
我是一名优秀的程序员,十分优秀!