android - 如何保持 ExpandableListView 复选框的选中状态?

标签 android android-sqlite expandablelistview android-checkbox

目前我可以通过 groupPosition 和 childPosition 选中/取消选中复选框,并且工作正常。我将 groupPosition 和 childPosition 保存到 SQLite 数据库。

当我添加删除选项时,我的复选框选中状态为关闭/困惑。

例如,我有以下内容:

第 1 组,

child 1、 child 2、 child 3

我检查了所有 3 个并将检查的位置保存到 SQLite 数据库。 选中的位置将是数据库中的 0,0 和 0,1 和 0,2。

我删除Child1后,

Child2 成为位置 0,Child3 成为位置 1,这会弄乱选中的状态。

我正在尝试找到一种方法来将组名称和子名称而不是位置保存到 SQLite 数据库中,然后在 Oncrete 方法中加载这些名称。

主要 Activity :

if(category_array.get(groupPosition).subcategory_array.get(childPosition).selected) {

        category_array.get(groupPosition).subcategory_array.get(childPosition).selected = false;    
        try{
            MySQLITE_DATABASE.deleteRows(groupPosition, childPosition);
           }            
        catch (Exception e) {}

 } 
  else 
 {
    category_array.get(groupPosition).subcategory_array.get(childPosition).selected = true;                 
    MySQLITE_DATABASE.addRow(groupPosition, childPosition);
 }

适配器代码:

private List<Category> mGroupCollection;

if(mGroupCollection.get(groupPosition).subcategory_array.get(childPosition).selected) {
    childHolder.checkBox.setBackgroundResource(R.drawable.checkbox_checked);

} else {
    childHolder.checkBox.setBackgroundResource(R.drawable.checkbox_unchecked);
}

日期持有人类:

public class Category {
public String category_name = null;
public String cat_SelectedChildCount_name;
public ArrayList<SubCategory> subcategory_array = new ArrayList<SubCategory>();
}

//==============================

public class SubCategory {
public String subcategory_name = null;
public boolean selected = false;
}

我想将组名和子名而不是位置保存到 SQLite 数据库,然后在 OnCreate 方法中加载它们。

我已经试过了,但是没有用:

 String Group_Name = category_array.get(Integer.parseInt(groupPosition)).category_name;             
 String Child_Name = category_array.get(Integer.parseInt(groupPosition)).
                                                subcategory_array.get(Integer.parseInt(childPosition)).subcategory_name;



if(category_array.get(Group_Name).subcategory_array.get(Child_Name).selected) {
   category_array.get(Group_Name).subcategory_array.get(Child_Name).selected = false;
   MySQLITE_DATABASE.DeleteRow(Group_Name, Child_Name); 
}

else {               
    category_array.get(Group_Name).subcategory_array.get(Child_Name).selected = true;
    MySQLITE_DATABASE.AddRow(Group_Name, Child_Name); 
    }

我知道我需要更改适配器、数据持有者类和 mainactivity 中的代码才能使其正常工作,但我没有主意。想来想去,还是没有什么效果……

有人可以指导我吗?

抱歉代码太长了。

谢谢,谢谢。

最佳答案

如果适合您的要求,请尝试以下任一方法。

如果你想严格使用位置(可能没有唯一的选项)

  • 保持数据库设计

| id | parent_position | child_position |

假设您有 N 个 child 。如果你删除一个 child (假设它是 0)。这样做

  • 用 (child_position = child_position - 1) 更新所有位置大于 父项的已删除子项。所以立场不变。

如果有删除选项,我个人建议不要使用 position。我找到的选项,但不知道您的用例

  • 如果您从数据库中加载列表,请使用数据库 primarykey 作为 key ,以便在选择/取消选择时将其保存在 SQLite 数据库 中。在这种情况下,您也不想知道 parent 的职位。

关于android - 如何保持 ExpandableListView 复选框的选中状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26183396/

相关文章:

android - 在android RecyclerView中添加图标

java - 如何在选中复选框时进行全屏 Activity

android - 游标和获取数据有问题吗?

java - BaseExpandableListAdapter 中的不可扩展项目

java - 如何停止向数据库sqlite添加数据?

android - 如何检查联系人是否存在于数据库android中

android - 如何在 Kotlin 中初始化 Array<List<Model>>?

java - 如何在android导航组件中手动关闭 fragment

java - 您可以使用 Retrofit 2 和 Gson 将 ISO 8601 时间戳直接映射到 OffsetDateTime 或 ZonedDateTime 吗?

android - facebook 在 android studio 中与最新的 Facebook Sdk 集成