Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 复选框Ischecked返回true,但未进行目视检查_Android_Listview_Checkbox - Fatal编程技术网

Android 复选框Ischecked返回true,但未进行目视检查

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

我正在尝试从数组初始化复选框listview。 为此,我将遍历listview项并检查该项是否存在,如果存在,则将其设置为checked。问题是它并没有像预期的那样工作。在内部,一切正常,结果数组是正确的,但从视觉上看,它不会以正确的状态显示复选框

这是初始化复选框的函数,由onCreate和onResume方法调用

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()
中读取它。