1

目前我可以通过groupPosition和childPosition检查/取消选中复选框,并且工作正常。我将groupPosition和childPosition保存到SQLite数据库。如何保持ExpandableListView复选框检查状态?

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

例如,我有以下几点:

组别1,

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

日期holder类:

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

我知道我需要改变的adapater代码,数据持有类和mainactivity为了使它工作,但我出于想法。我一直在思考和思考,但没有什么作品...

有人请请指导我这个?

对于长码我很抱歉。

谢谢,谢谢。

回答

1

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

如果你希望只使用位置(可能是没有独特的选项)

  • 保持DB设计像

| id | parent_position | child_position | 

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

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

我个人建议不要使用position如果有删除选项。选项,我发现,但不知道你的使用情况

  • 如果您正在加载从数据库列表中使用数据库primarykey为重点,以将其保存在SQLite database上选择/去除选择。在这种情况下,你也不想知道父母的位置。
+0

感谢您的意见。你提到如果有删除选项,就不要使用该位置。我怎样才能做到这一点?在我的适配器中,它需要groupPosition和childPosition才能使复选框处于选中状态或未选中状态。就child_position - 1而言,我已经考虑过了,但是当我删除了超过1个childPositions时,我认为它会表现缓慢。我非常感谢。 – 2014-10-03 18:16:00

+0

是的。它会有点。在你的适配器中,你可以'设置标签'你想要与列表的每一行关联的细节。尝试使用 – 2014-10-04 07:12:30

+0

我不知道如何从setTag和getTag开始。我只给你一个提及child_position = child_position的检查 - 1.我现在就带着这个想法,直到我现在了解更多关于Android的更好的表现。非常感谢帮助我的朋友。 – 2014-10-05 04:00:13