【问题标题】:Fragment onCreateView() being called with old values使用旧值调用片段 onCreateView()
【发布时间】:2014-03-24 19:27:13
【问题描述】:

我有一个活动,我在活动布局 xml 中的 FrameLayout 中加载片段。我有 2 个片段:ListFragmentPreferenceFragment

ListFragment 使用ArrayAdapter 并显示一个array,它是一个类变量并填充在ArrayAdapter 的构造函数中。这包含存储在数据库中的日期。

现在,当用户单击 ActionBar 中的首选项按钮时,ListFragment 将替换为 PreferenceFragment。这里我允许用户更改日期格式。

到目前为止一切顺利。

现在,当用户按 backPreferenceFragment 返回时,我会覆盖Activity.onBackPressed() 以将PreferenceFragment 替换为ListFragment

在这里我仍然看到旧格式的日期,并且没有反映用户选择的设置。在调试时,我看到ListFragment.onCreateView() 被称为两次。第一次使用用户刚刚选择的新日期格式加载新加载的数组。第二次加载旧的日期数组(它以某种方式保存了!)。

我只在Activity.onCreate()Activity.onBackPressed() 中使用FragmentTransaction.replace()

我花了一整天的时间来解决这个问题。根据this,这不应该发生,因为我正在使用替换。我无法在网上找到任何东西。任何建议表示赞赏。

更新:根据thisArrayAdapter.onNotifyDatasetChanged() 仅在使用 Arrayadpaters 自己的 add、clear 等方法更新列表时生效。所以现在在ListFragment.onResume() 我打电话给adapter.clear()adapter.addAll(sqliteclass.getArray())。这可行,但我现在在onCreate()onResume() 中对数据库进行2 次访问

【问题讨论】:

    标签: android fragment


    【解决方案1】:
    1. 无需覆盖 onBackPress() 即可反转 FragmentTransaction
      只需拨打FragmentTransaction 上的addToBackStack(),将列表替换为首选项即可。
    2. 尝试在您的ListFragmentonResume() 中的ListAdapter 上调用notifyDataSetChanged()。这应该会强制重新创建项目的视图。

    【讨论】:

    • 这没有帮助。不知何故,旧格式仍然显示! stackoverflow.com/questions/3219779/… 表示 notifyDataSetInvalidated() 没有做任何事情..
    • 抱歉,notifyDataSetChanged() 是我想建议的。
    • 还是一样 :(... 不知道出了什么问题。如果您有任何建议,请告诉我!感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多