【发布时间】:2014-03-24 19:27:13
【问题描述】:
我有一个活动,我在活动布局 xml 中的 FrameLayout 中加载片段。我有 2 个片段:ListFragment 和 PreferenceFragment。
ListFragment 使用ArrayAdapter 并显示一个array,它是一个类变量并填充在ArrayAdapter 的构造函数中。这包含存储在数据库中的日期。
现在,当用户单击 ActionBar 中的首选项按钮时,ListFragment 将替换为 PreferenceFragment。这里我允许用户更改日期格式。
到目前为止一切顺利。
现在,当用户按 back 从PreferenceFragment 返回时,我会覆盖Activity.onBackPressed() 以将PreferenceFragment 替换为ListFragment。
在这里我仍然看到旧格式的日期,并且没有反映用户选择的设置。在调试时,我看到ListFragment.onCreateView() 被称为两次。第一次使用用户刚刚选择的新日期格式加载新加载的数组。第二次加载旧的日期数组(它以某种方式保存了!)。
我只在Activity.onCreate() 和Activity.onBackPressed() 中使用FragmentTransaction.replace()。
我花了一整天的时间来解决这个问题。根据this,这不应该发生,因为我正在使用替换。我无法在网上找到任何东西。任何建议表示赞赏。
更新:根据this,ArrayAdapter.onNotifyDatasetChanged() 仅在使用 Arrayadpaters 自己的 add、clear 等方法更新列表时生效。所以现在在ListFragment.onResume() 我打电话给adapter.clear() 和adapter.addAll(sqliteclass.getArray())。这可行,但我现在在onCreate() 和onResume() 中对数据库进行2 次访问。
【问题讨论】: