【问题标题】:Save ListView content保存 ListView 内容
【发布时间】:2014-03-17 18:03:31
【问题描述】:

我有一个 Google 的 NavigationDrawer,它添加/替换了 fragmentsfragments 之一有一个 listView 通过网络请求填充自定义 BaseAdapterasyncTask,需要时间)。我想要的是将listView 内容保存在某处,因此如果用户通过navigationDrawer 导航到另一个片段,然后或稍后导航回包含listViewfragment - 我希望listView 立即填充已保存asyncTask 完成加载新内容之前的旧内容。最低 API 为 10。

我尝试了什么。

  1. onSaveInstanceState - 序列化Parcelable ArrayList<CustomObject>。不知何故,我没有让它工作。此外,这并不能解决我的问题,因为 onSaveInstaceState 不会在通过 navigationDrawer 导航时触发。

  2. 设置新片段的InitialState(setInitialSavedState) 然后saving(saveFragmentInstanceSate)/加载它。这适用于 EditTexts 和 TextView 等简单视图,但不适用于 listView。

保存 listView 内容的最佳方法是什么?请帮帮我。

【问题讨论】:

  • 将其保存在您的 AsyncTask 中并让 Adapter 读取保存的数据
  • @psknik 更多详情?
  • 发布更多代码以便更好地理解
  • 将其保存在某处:在 sqlite 中,在使用 json 等的文件中,并创建一个读取已保存数据的适配器
  • @psknik 保存到文件或 sqlite。这是最好的方法吗?会不会很慢?

标签: android android-listview android-fragments android-asynctask navigation-drawer


【解决方案1】:

首先获取列表视图的所有项目。

CustomListViewAdapter listadapter = (CustomListViewAdapter) listview.getAdapter();
ArrayList<CustomObject> object=new ArrayList<CustomObject>();
for(int position=0;position<listadapter.getCount();position++)
    object.add(videoadapter.getItem(position));

现在使用object 来存储列表视图的项目

然后使用共享首选项保存对象。 Android ArrayList of custom objects - Save to SharedPreferences - Serializable?

【讨论】:

  • 将内容存储在变量中没有问题。但是在用户离开片段后 - 它会随着 vith 变量被破坏。
  • 如果这对你有帮助……那么至少给我点赞或接受答案
  • 用 gson 序列化 - 慢。 ArrayList 不接受使用 ObjectSerializer 进行序列化,所以我仍在寻找更好的解决方案。
【解决方案2】:

执行此操作的正确方法是将网络查询结果保存在数据库 (sqlite) 中,并使用该数据库中的数据显示列表中的项目(CursorAdapter 最适合此操作)。

这些教程很好地解释了如何使用 Sqlite 制作您自己的 Content Provider,并使用 CursorAdapter 在列表中显示您的数据。

http://docs.xamarin.com/guides/android/user_interface/working_with_listviews_and_adapters/part_4_-_using_cursoradapters/

http://www.vogella.com/tutorials/AndroidSQLite/article.html

【讨论】:

    【解决方案3】:

    我找到了一个好方法。

        String list_items = "";   // all your items are here,               but separate it with a comma (,)
        String[] list = list_items.separate(",");
    

    并将 list_items 保存在共享首选项中。要检索只需使用 getString() 并使用上面的代码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多