【问题标题】:CheckBox isCheked returns true but visually is not checkedCheckBox isCheked 返回 true 但在视觉上未检查
【发布时间】:2016-04-01 20:52:31
【问题描述】:

我正在尝试从数组初始化复选框列表视图。 为此,我将遍历 listview 项目并检查该项目是否存在,如果存在,则将其设置为选中。事情是它并没有真正按预期工作。内部一切正常,结果数组是正确的,但在视觉上它并没有以正确的状态显示复选框。

这是初始化复选框的函数,由 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
        }
    }
}

但该复选框未通过目视检查。如果需要更多代码,请告诉我,这个代码真的很辛苦。

【问题讨论】:

  • 您可以添加一个xml来检查复选框是否配置良好。代码看起来不错

标签: android listview checkbox


【解决方案1】:

你正在做的事情是行不通的。

当您调用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()中使用该项目模型以显示当前状态.

【讨论】:

  • 感谢您的详细解释 kris,我知道我需要以某种方式通知列表有关更改的信息。我仍然没有弄清楚如何解决我的问题。您提到的布尔数组是我的 List_to_compare 数组的一种,因为不存在的将不会被检查。
  • 我想要让它按照你的建议工作,剩下要做的就是实现 setItemChecked 方法,对吧?
  • 所以复选框只是显示?如果用户点击它没有任何变化?我只是假设您在选中复选框时做了一些事情,并且您没有为此发布代码。
  • 有点,想一想复选框的列表视图来从列表中选择项目。一旦你回到列表(第二次及以后),我所有的努力就是用所选项目初始化列表
  • 我更新了我的答案,也许它仍然不准确,但关键是,您确定getView() 中复选框的当前状态并将其设置在那里。如果您正在跟踪用户何时(取消)选中该复选框,则需要将新状态存储在适配器中的某处并在getView() 中读取。
猜你喜欢
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多