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