Android 复选框Ischecked返回true,但未进行目视检查
我正在尝试从数组初始化复选框listview。 为此,我将遍历listview项并检查该项是否存在,如果存在,则将其设置为checked。问题是它并没有像预期的那样工作。在内部,一切正常,结果数组是正确的,但从视觉上看,它不会以正确的状态显示复选框 这是初始化复选框的函数,由onCreate和onResume方法调用Android 复选框Ischecked返回true,但未进行目视检查,android,listview,checkbox,Android,Listview,Checkbox,我正在尝试从数组初始化复选框listview。 为此,我将遍历listview项并检查该项是否存在,如果存在,则将其设置为checked。问题是它并没有像预期的那样工作。在内部,一切正常,结果数组是正确的,但从视觉上看,它不会以正确的状态显示复选框 这是初始化复选框的函数,由onCreate和onResume方法调用 public void init() { View v; CheckBox checkbox; for (int i = 0; i < LIST.ge
public void init()
{
View v;
CheckBox checkbox;
for (int i = 0; i < LIST.getCount(); i++) {
v = LIST.getAdapter().getView(i, null, null);
checkbox = (CheckBox)v.findViewById(R.id.checkbox);
MyClass c = (MyClass) adapter.getItem(i);
if(List_to_compare.contains(c)) {
Log.i("Before", String.valueOf(checkbox.isChecked())); //returns false
checkbox.setChecked(true);
Log.i("After", String.valueOf(checkbox.isChecked())); //returns true
}
}
}
public void init()
{
观点五;
复选框;
对于(int i=0;i
但该复选框未进行目视检查。如果需要更多的代码,请让我知道,这是一个很难解决的问题。您所做的不会起作用 当您调用
getView()
并更改视图时,ListView
不知道您更改了该视图。ListView
本身调用getView()
来呈现列表项,它将忽略您所做的任何操作
以下是修复方法:
您将在适配器中重写getView()
,而不是调用getView()
,并具有如下代码行:
checkbox = (CheckBox)v.findViewById(R.id.checkbox);
MyClass c = (MyClass) getItem(position);
checkbox.setChecked(List_to_compare.contains(c));
为了便于将来参考,在调用
notifyDataSetChanged()
之前,对ListView
项的任何更改都应在适配器中对该项的模型进行更改,并且该项模型应在getView()
中使用以显示当前状态。您可以添加xml以检查复选框是否配置良好。代码看起来很好谢谢你的详细解释克里斯,我知道我需要通知列表关于更改的代码。我还没有想出解决问题的办法。你提到的布尔数组有点像我的列表对比较数组,因为没有的数组不会被检查。我想要让它像你建议的那样工作,剩下要做的就是实现setItemChecked方法,对吗?所以复选框是只显示的?如果用户点击它,什么都不会改变吗?我只是假设您在选中复选框时做了一些事情,并且没有发布相应的代码。我所要做的就是在您返回列表后(第二次及以后)用所选项目初始化列表。我更新了我的答案,可能仍然不准确,但关键是,您确定getView()
中复选框的当前状态并将其设置在那里。如果您正在跟踪用户何时(取消)选中复选框,则需要将新状态存储在适配器的某个位置,并在getView()
中读取它。