2013-09-28 60 views
2

我有一個擴展列表,這是從HashMap<String, List<String>>,我想知道是否有某種可能性存儲該值的偏好或某事,所以用戶可以編輯展開的列表條目。任何信息,建議將不勝感激。如何存儲/保存HashMap <String,列表<String>>

目前,我創造了節目單,它不保存任何首選項:

public class MainActivity extends Activity{ 
     ExpandableListAdapter listAdapter; 
     ExpandableListView expListView; 
     List<String> listDataHeader; 
     HashMap<String, List<String>> listDataChild; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      requestWindowFeature(Window.FEATURE_NO_TITLE); 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 




      // get the listview 
      expListView = (ExpandableListView) findViewById(R.id.lvExp); 

      // preparing list data 
      prepareListData(); 

      listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild); 

      // setting list adapter 
      expListView.setAdapter(listAdapter); 


     } 

     /* 
     * Preparing the list data 
     */ 
     private void prepareListData() { 
      listDataHeader = new ArrayList<String>(); 
      listDataChild = new HashMap<String, List<String>>(); 

      // Adding header data 
      listDataHeader.add("Vegetables"); 
      listDataHeader.add("Fruits"); 
      listDataHeader.add("Drinks"); 

      // Adding child data 
      List<String> vegetables = new ArrayList<String>(); 
      vegetables.add("Tomatoes"); 
      vegetables.add("Potatoes"); 
      vegetables.add("Cucumbers"); 
      vegetables.add("Pumpkins"); 
      vegetables.add("Peppers"); 
      vegetables.add("Onions"); 
      vegetables.add("Garlic"); 

      List<String> fruits = new ArrayList<String>(); 
      fruits.add("Strawberries"); 
      fruits.add("Blackcurrants"); 
      fruits.add("Redcurrant"); 
      fruits.add("Gooseberry"); 
      fruits.add("Kiwifruit"); 
      fruits.add("Grape"); 

      List<String> drinks = new ArrayList<String>(); 
      drinks.add("Vodka"); 
      drinks.add("Milk"); 
      drinks.add("Water"); 
      drinks.add("CocaCola"); 
      drinks.add("Sprite"); 

      listDataChild.put(listDataHeader.get(0), vegetables); // Header, Child data 
      listDataChild.put(listDataHeader.get(1), fruits); 
      listDataChild.put(listDataHeader.get(2), drinks); 
     } 


     private String does(String child) { 
      Intent intent = new Intent(this, Confirmation.class); 
      intent.putExtra("key", child); 
      startActivity(intent); 
      return null; 
     } 

} 

LOG

09-29 17:21:42.039: E/dalvikvm(25076): Could not find class 'com.google.gson.Gson', referenced from method lt.whiteGroup.ultimateshoppinglist.MainActivity.prepareListData 
09-29 17:21:42.125: E/AndroidRuntime(25076): FATAL EXCEPTION: main 
09-29 17:21:42.125: E/AndroidRuntime(25076): java.lang.NoClassDefFoundError: com.google.gson.Gson 
09-29 17:21:42.125: E/AndroidRuntime(25076): at lt.whiteGroup.ultimateshoppinglist.MainActivity.prepareListData(MainActivity.java:117) 
09-29 17:21:42.125: E/AndroidRuntime(25076): at lt.whiteGroup.ultimateshoppinglist.MainActivity.onCreate(MainActivity.java:45) 
09-29 17:21:42.125: E/AndroidRuntime(25076): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
09-29 17:21:42.125: E/AndroidRuntime(25076): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) 
09-29 17:21:42.125: E/AndroidRuntime(25076): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 
09-29 17:21:42.125: E/AndroidRuntime(25076): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
09-29 17:21:42.125: E/AndroidRuntime(25076): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 
09-29 17:21:42.125: E/AndroidRuntime(25076): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-29 17:21:42.125: E/AndroidRuntime(25076): at android.os.Looper.loop(Looper.java:130) 
09-29 17:21:42.125: E/AndroidRuntime(25076): at android.app.ActivityThread.main(ActivityThread.java:3687) 
09-29 17:21:42.125: E/AndroidRuntime(25076): at java.lang.reflect.Method.invokeNative(Native Method) 
09-29 17:21:42.125: E/AndroidRuntime(25076): at java.lang.reflect.Method.invoke(Method.java:507) 
09-29 17:21:42.125: E/AndroidRuntime(25076): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
09-29 17:21:42.125: E/AndroidRuntime(25076): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
09-29 17:21:42.125: E/AndroidRuntime(25076): at dalvik.system.NativeStart.main(Native Method) 

回答

3

你有相當複雜的結構,所以在你的情況下,我更喜歡使用Gson庫序列化(轉換)HashMap<String, List<String>>String並存儲爲基本字符串偏好。

作爲例子:

Gson gson = new Gson(); 
String str = gson.toJson(listDataChild); 

str後的字符串

爲了把它抓回來,從首單String提取字符串並加載您Map這樣的:

Gson gson = new Gson(); 
Type type = new TypeToken<HashMap<String, List<String>>>(){}.getType(); 
HashMap<String, List<String>> map = gson.fromJson(str, type); 

通過這種你可以存儲任何課程並在下次加載時重新獲得。

作爲一個側面說明

我使用這種技術的所有應用程序配置喜好存儲爲每個更改處理。通過這種方式,如果發生崩潰,用戶配置的數據將被保存。

但是,如果你仍然想保存地圖,看到this answer在SO

+0

非常感謝你,你提出了一個完善的解決方案:)。我會盡量調整它並儘快給你寫信。 – whiteLT

+0

順便說一句,如果你有時間,你能解釋一下Gson和Json是什麼嗎? – whiteLT

+0

Json是用於將/從String轉換/提取任何變量的語言。當Gson是可以將所有類直接轉換爲字符串的包時,字符串 –

相關問題