【问题标题】:How store/save HashMap<String, List<String>>如何存储/保存 HashMap<String, List<String>>
【发布时间】:2013-10-04 12:37:01
【问题描述】:

我有一个扩展列表,由 HashMap&lt;String, List&lt;String&gt;&gt; 组成,我想知道是否有可能将该值存储到首选项或其他内容中,以便用户可以编辑扩展列表条目。任何信息,建议将不胜感激。

目前我正在程序中创建列表,它没有保存到任何首选项:

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

}

日志

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)

【问题讨论】:

    标签: android sharedpreferences expandablelistview


    【解决方案1】:

    您的结构非常复杂,所以在您的情况下,我更喜欢使用 Gson 库来序列化(转换)HashMap&lt;String, List&lt;String&gt;&gt;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);
    

    通过这种方式,您可以存储任何类并在下次加载时将其取回。

    附注

    我使用这种技术将所有应用程序配置存储到首选项中,作为每次更改的处理程序。这样如果发生崩溃,用户配置的数据将被保存。

    但如果你仍然想存储地图,请参阅 SO 中的this answer

    【讨论】:

    • 非常感谢,您提出了一个合理的解决方案:)。我会尽量适应它并尽快给你写信。
    • 顺便问一下,如果有时间,能解释一下Gson和Json是什么吗?
    • Json 是用于将任何变量从字符串转换/提取为字符串的语言。当 Gson 是能够将你的所有类直接转换为字符串的包时
    • 谢谢,因为我有listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild);,我将不得不在listDataHeader``listDataChild 上使用gson 和json,还是有更简单的方法?
    • 顺便说一句,我需要 Gson 和 Json 什么,因为我的 Eclipse 不建议我导入任何东西
    猜你喜欢
    • 2012-06-18
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多