2013-09-28 65 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是可以将所有类直接转换为字符串的包时,字符串 –

相关问题