【问题标题】:Check a CheckBox within a RecyclerView when it is loaded加载时检查 RecyclerView 中的 CheckBox
【发布时间】:2016-10-08 03:00:22
【问题描述】:

我正在创建一个包含项目的RecyclerView。每个项目都有一个CheckBoxImageButton 和一个TextView,如下所述:

public class RecyclerViewViewHolder extends RecyclerView.ViewHolder {
    RelativeLayout item;
    TextView id;
    TextView name;
    ImageButton delete;
    CheckBox checkBox;

    public RecyclerViewViewHolder(View view) {
        super(view);

        item = (RelativeLayout) view.findViewById(R.id.layout_item_item);
        id = (TextView) view.findViewById(R.id.layout_item_id);
        name = (TextView) view.findViewById(R.id.layout_item_name);
        delete = (ImageButton) view.findViewById(R.id.layout_item_delete);
        checkBox = (CheckBox) view.findViewById(R.id.layout_item_checkbox);
    }
}

我希望仅当数据库列中的某个值等于1 时才检查checkbox 视图。如果值为0,则不应检查。我从下面的代码开始:

SQLiteDatabaseAdapter database = new SQLiteDatabaseAdapter(context);
    database.open();

    Cursor cursor = database.getAllItems(table);

    if (cursor.moveToFirst()) {
        do {
            if (cursor.getInt(2) == 0) {
                viewHolder.checkBox.setChecked(false);
            }

            else {
                viewHolder.checkBox.setChecked(true);
            }

        } while (cursor.moveToNext());

    }

    database.close();

此代码有效,但它检查数据库中的第一行,如果 checked 列是 1,它会更改 每个 单个 CheckBox 以进行检查。我只想检查与特定行关联的CheckBox,而不是每一个。我该怎么做?

【问题讨论】:

  • 使用 hashmap 保存来自数据库的数据并通知 recyclerview 适配器。在adapter的onBIndView()处根据hashmap中的数据勾选checkbox。
  • @Malith Lakshan 我会尝试使用哈希图。
  • 请显示哪个类和方法包含代码sn-p。
  • 我现在已经弄清楚了。我不太确定整个HashMap<> 的事情。所有的代码都在上面。它在代码的第二部分 onBindViewHolder 函数中。我很乐意接受更多建议。
  • 随意编辑您的问题以显示包含的类和方法。这将有助于使您的问题更清楚。至于答案,我会尽快发布。

标签: android android-studio android-recyclerview android-checkbox


【解决方案1】:

问题是您正在遍历游标中的每一行。相反,您需要通过调用cursor.moveToPosition() 转到当前position 所在的行。

在伪代码中,您应该遵循的步骤是

  1. 打开数据库。
  2. 获取光标。
  3. 将光标移动到正确的行。
  4. 从光标中检索值。
  5. Checkbox 设置为正确的状态。
  6. 关闭光标。

我把细节留给读者作为练习。

【讨论】:

  • 就个人而言,我认为这应该是公认的答案。
  • @Dynamix 否。唯一的if 语句应该是检查数据库中正确行的值的语句。
  • 好吧。只是为了让你知道,我放弃了这个项目,但我会将你的反馈用于我的新项目。所以谢谢你,非常感谢你的帮助。
  • @Razor 感谢您的信任投票。当然,如果有任何效率问题,数据结构解决方案也有它的位置。
【解决方案2】:

我建议您创建一个 HashMap<> 并将 ID 和选中状态关联起来。然后,您可以参考HashMap<> 并获取检查状态。

HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();

然后,在您的onBindViewHolder 函数中,您可以使用以下内容来检查您的CheckBox

if (hashMap.get(position) == 0) {
    // not checked
}

else {
    // checked
}

确保从 SQLite 数据库添加 ID 和检查状态。

【讨论】:

  • 谢谢,我一直在等待答复。我不确定如何做到这一点。现在我可以自己弄清楚数据库部分了。
  • 作为一个小建议,List 或数组可能比HashMap 更合适,因为键是Integers。 (当然,对于 OP 来说,这一点似乎没有实际意义。我只是想我会把它贴在这里以供将来的后代使用。)
  • @Code-Apprentice 绝对!我发现 HashMap&lt;&gt; 更好,如果你只想要一个特定的值,用另一个值检索它,但 List&lt;&gt; 也是一个不错的选择!
猜你喜欢
  • 2016-03-18
  • 2015-12-02
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 2011-08-14
相关资源
最近更新 更多