如何保持ExpandableListView复选框已检查状态?

时间:2014-10-03 17:00:49

标签: android android-sqlite expandablelistview android-checkbox

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

当我添加删除选项时,我的复选框选中状态已关闭/搞砸了。

例如,我有以下内容:

Group1,

Child1,Child2,Child3

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

删除Child1后,

Child2变为位置0,Child3变为位置1,这将使检查状态变得混乱。

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

MainActivity:

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); 
    }

我知道我需要更改适配器,数据持有者类和主要活动中的代码才能使其正常工作,但我没有想法。我一直在思考和思考,但没有任何作用......

请有人请指导我吗?

我很抱歉长码。

谢谢,谢谢。

1 个答案:

答案 0 :(得分:1)

如果符合您的要求,请尝试以下任何一项。

如果你想严格使用这个职位(可能没有独特的选择)

  • 保持数据库设计

| id | parent_position | child_position |

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

  • 使用位置大于的(child_position = child_position - 1)更新所有子项 父母的已删除子女。所以这个职位保持不变。

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

  • 如果要从数据库加载列表,请使用数据库primarykey作为密钥,将其保存在选择/取消选择的SQLite database中。在这种情况下,您也不想知道父位置。