我有一个Activity,我在活动布局xml中的FrameLayout
中加载片段。我有2个片段:ListFragment
和PreferenceFragment
。
ListFragment
使用ArrayAdapter
并显示数组,它是一个类变量,并填充在ArrayAdapter的构造函数中。它包含存储在数据库中的日期。
现在,当用户点击操作栏中的“偏好设置”按钮时,ListFragment
将替换为PreferenceFragment
。在这里,我允许用户更改日期格式。
到目前为止一切顺利。
现在,当用户按返回以从PreferenceFragment
返回时,我会覆盖Activity.onBackPressed()
以将PreferenceFragment
替换为ListFragment
。
在这里,我仍然看到旧格式的日期,并且未反映用户选择的设置。经过调试,我发现ListFragment.onCreateView()
被称为两次。第一次使用用户刚刚选择的新日期格式加载新加载的数组。第二次加载旧的日期数组(以某种方式保存它!)。
我仅在FragmentTransaction.replace()
和Activity.onCreate()
中使用Activity.onBackPressed()
。
我花了一整天才弄明白这一点。根据{{3}},这不应该发生,因为我使用替换。我无法在网上找到任何东西。任何建议都表示赞赏。
更新:根据this,ArrayAdapter.onNotifyDatasetChanged()
仅在使用Arrayadpaters自己的add,clear等方法更新列表时生效。现在在ListFragment.onResume()
我呼叫adapter.clear()
和adapter.addAll(sqliteclass.getArray())
。这有效,但我现在正在onCreate()
和onResume()
对数据库进行 2次。
答案 0 :(得分:0)
onBackPress()
即可撤销FragmentTransaction
只需在addToBackStack()
上调用FragmentTransaction
,然后使用首选项替换列表。notifyDataSetChanged()
ListAdapter
的{{1}}上致电onResume()
。这应该强制重新创建项目的视图。