首页 > 解决方案 > 更改单例片段时,recyclerview 有这种状态吗?

问题描述

我正在使用单例片段。我想当我调用这个单例片段时,生命周期方法onCreateView只会onActivityCreated被调用一次。但是即使片段是单例的,它们也不是,onCreateView并且onActivityCreated在我调用片段时被调用。但是我发现了一些奇怪的东西。也就是说,它RecyclerView正在保持它的位置。如果我将 A 片段(使用RecyclerView, 位置在 20)移动到 B 片段并重定向到 A 片段,则 A 片段位置为 20。虽然再次调用onCreateViewand onActivityCreated,为什么保存 A 片段位置?

ps:我知道kotlin支持单例类“Objcet”。但我更喜欢使用单例构造函数而不是对象类。

主要活动

    navigation_view.setNavigationItemSelectedListener {
        drawerLayout.closeDrawer(GravityCompat.START)
        when(it.itemId){
            R.id.scheduleFragment->{
                changeFragment(scheduleFragment)
            }
            R.id.noticeFragment->{
                changeFragment(NoticeFragment())
            }

        }

        true
    }

}

分段

 companion object {
     var scheduleFragment: ScheduleFragment? = null
  }

fun getInstance(context: Context): ScheduleFragment {
    if (scheduleFragment == null) {
        scheduleFragment = ScheduleFragment()

    }
    return scheduleFragment!!
}

标签: android

解决方案


嗯,它的行为完全符合预期。recycler-view 的视图,位置都是片段实例的成员。所以值保持不变,因为它只有一个实例。但是生命周期方法与片段类是单例的事实无关。当特定事件发生时,它们会被调用。例如,当创建活动时,系统会调用 onActivityCreated 方法,该方法调用与片段实例的创建无关。因为当您创建片段实例时,片段实例的创建发生得更早。现在,在使用之后,您是想保留实例还是销毁它,这是您的选择。希望这能消除您的困惑。如果你有什么不明白的,请告诉我。


推荐阅读