如何将listView.onSaveInstanceState存储到SharedPreferences中?

时间:2018-06-18 01:29:52

标签: android listview

我使用listView并希望从我离开的地方恢复/恢复listView项目/状态(即使在app关闭后)。 为此,我使用

Parcelable state = listView.onSaveInstanceState();

状态属于 Parcelable 类型,因为它在使用

恢复listView时也返回parcelable类型的结果
listView.onRestoreInstanceState(state);

它需要 Parcelable 类型数据作为参数。 如果用户没有关闭应用程序,它可以完美地工作(使用静态变量)。 但我希望将此数据保存到 SharedPreferences 中,这有助于用户在关闭应用后恢复listView。

我不知道如何将此数据存储到SharedPreferences中。请帮我解决这个问题。

我也试过这个解决方案 How Android SharedPreferences save/store object 但它并没有解决我的问题。该应用程序正在崩溃

Parcelable obj = gson.fromJson(json, Parcelable.class);

所以,请不要复制我的问题,如果你知道解决方案只是回答它。

1 个答案:

答案 0 :(得分:0)

我假设您的列表视图具有一个包含所需数据的适配器,因此您可以将该数据保存在某个位置(例如,在共享首选项中),而不是整个视图的可打包区域,例如如果您的适配器数据是ArrayList<ModelA>,则可以执行以下操作:

if ( listview.getAdapter() instanceof MyAdapter){
    MyAdapter adapter = (MyAdapter) listview.getAdapter();
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString( "adapterdata" , gson.toJson(adapter.getData()));
    editor.commit(); //or editor.apply()
}

以及何时要检索数据

String dataJson = prefs.getString( "adapterdata" , "");
ArrayList<ModelA> data = gson.fromJson( dataJson, new TypeToken<ArrayList<ModelA>>(){}.getType());

if ( data != null ){
    //set data to your listview, also it's logical to delete retrieved data from sharedpreferences
    SharedPreferences.Editor editor = prefs.edit();
    editor.remove("adapterdata");
    editor.commit();
}