Gridview 中的复选框未在 setSelection() 上被选中
Checkbox in Gridview not being checked on setSelection()
我有一个 gridview,其项目布局实现了可检查,因此 gridview 可以在选择项目时处理检查项目布局中的复选框。除了设置以编程方式选择的 gridview 项目外,这一切都很好。复选框看起来没有被选中,但一定是在后台发生了一些事情,因为选择该项目之后,它会保持未选中状态,再次选择时,它会变成选中状态。
有什么想法吗?
编辑:似乎在点击时保持未选中状态是由于我的代码中的一些其他逻辑,所以这可能是对实际问题的转移注意力。
可检查的布局
public class WeedFilterItem extends LinearLayout implements Checkable {
private TextView label;
private CheckBox checkBox;
private boolean mChecked;
public WeedFilterItem(Context context) {
super(context);
init();
}
public WeedFilterItem(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public WeedFilterItem(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
inflate(getContext(), R.layout.weed_filter_item, this);
this.label = (TextView) findViewById(R.id.filter_textview);
this.checkBox = (CheckBox) findViewById(R.id.checkbox);
}
public void setChecked(boolean checked) {
mChecked = checked;
this.checkBox.setChecked(checked);
}
public boolean isChecked() {
return mChecked;
}
public void toggle() {
setChecked(!mChecked);
}
}
项目布局xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"
android:layout_gravity="center"
android:scaleX="1.5"
android:scaleY="1.5"/>
<TextView
android:id="@+id/filter_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:layout_gravity="center"
android:paddingTop="10dp"
/>
</LinearLayout>
设置网格视图
final GridView filters = (GridView) child.findViewById(R.id.filter_gridview);
final WeedFilterGridViewAdapter adapter = new WeedFilterGridViewAdapter(this, values);
filters.setAdapter(adapter);
filters.setSelection(0);
其他一切都由普通 gridview 处理,只是试图调用 gridView.setSelection(int)
它。
我也试过将所选项目的整数存储在适配器中,并在调用 notifyDataSetChanged()
的同时设置在 getView 中手动选择的复选框,但这也不起作用。
已更新
final GridView filters = (GridView) child.findViewById(R.id.filter_gridview);
final WeedFilterGridViewAdapter adapter = new WeedFilterGridViewAdapter(this, values);
filters.setAdapter(adapter);
filters.setSelection(0);
// add this line
filters.setItemChecked(0, true);
http://developer.android.com/reference/android/widget/AbsListView.html#setItemChecked(int, boolean)
public void setItemChecked (int position, boolean value)
Added in API level 1 Sets the checked state of the specified position.
The is only valid if the choice mode has been set to
CHOICE_MODE_SINGLE or CHOICE_MODE_MULTIPLE.
Parameters position The item whose checked state is to be checked
value The new checked state for the item
我有一个 gridview,其项目布局实现了可检查,因此 gridview 可以在选择项目时处理检查项目布局中的复选框。除了设置以编程方式选择的 gridview 项目外,这一切都很好。复选框看起来没有被选中,但一定是在后台发生了一些事情,因为选择该项目之后,它会保持未选中状态,再次选择时,它会变成选中状态。
有什么想法吗?
编辑:似乎在点击时保持未选中状态是由于我的代码中的一些其他逻辑,所以这可能是对实际问题的转移注意力。
可检查的布局
public class WeedFilterItem extends LinearLayout implements Checkable {
private TextView label;
private CheckBox checkBox;
private boolean mChecked;
public WeedFilterItem(Context context) {
super(context);
init();
}
public WeedFilterItem(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public WeedFilterItem(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
inflate(getContext(), R.layout.weed_filter_item, this);
this.label = (TextView) findViewById(R.id.filter_textview);
this.checkBox = (CheckBox) findViewById(R.id.checkbox);
}
public void setChecked(boolean checked) {
mChecked = checked;
this.checkBox.setChecked(checked);
}
public boolean isChecked() {
return mChecked;
}
public void toggle() {
setChecked(!mChecked);
}
}
项目布局xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"
android:layout_gravity="center"
android:scaleX="1.5"
android:scaleY="1.5"/>
<TextView
android:id="@+id/filter_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:layout_gravity="center"
android:paddingTop="10dp"
/>
</LinearLayout>
设置网格视图
final GridView filters = (GridView) child.findViewById(R.id.filter_gridview);
final WeedFilterGridViewAdapter adapter = new WeedFilterGridViewAdapter(this, values);
filters.setAdapter(adapter);
filters.setSelection(0);
其他一切都由普通 gridview 处理,只是试图调用 gridView.setSelection(int)
它。
我也试过将所选项目的整数存储在适配器中,并在调用 notifyDataSetChanged()
的同时设置在 getView 中手动选择的复选框,但这也不起作用。
已更新
final GridView filters = (GridView) child.findViewById(R.id.filter_gridview);
final WeedFilterGridViewAdapter adapter = new WeedFilterGridViewAdapter(this, values);
filters.setAdapter(adapter);
filters.setSelection(0);
// add this line
filters.setItemChecked(0, true);
http://developer.android.com/reference/android/widget/AbsListView.html#setItemChecked(int, boolean)
public void setItemChecked (int position, boolean value)
Added in API level 1 Sets the checked state of the specified position. The is only valid if the choice mode has been set to CHOICE_MODE_SINGLE or CHOICE_MODE_MULTIPLE.
Parameters position The item whose checked state is to be checked value The new checked state for the item