android - 更改单例片段时,recyclerview 有这种状态吗?
问题描述
我正在使用单例片段。我想当我调用这个单例片段时,生命周期方法onCreateView
只会onActivityCreated
被调用一次。但是即使片段是单例的,它们也不是,onCreateView
并且onActivityCreated
在我调用片段时被调用。但是我发现了一些奇怪的东西。也就是说,它RecyclerView
正在保持它的位置。如果我将 A 片段(使用RecyclerView
, 位置在 20)移动到 B 片段并重定向到 A 片段,则 A 片段位置为 20。虽然再次调用onCreateView
and 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!!
}
解决方案
嗯,它的行为完全符合预期。recycler-view 的视图,位置都是片段实例的成员。所以值保持不变,因为它只有一个实例。但是生命周期方法与片段类是单例的事实无关。当特定事件发生时,它们会被调用。例如,当创建活动时,系统会调用 onActivityCreated 方法,该方法调用与片段实例的创建无关。因为当您创建片段实例时,片段实例的创建发生得更早。现在,在使用之后,您是想保留实例还是销毁它,这是您的选择。希望这能消除您的困惑。如果你有什么不明白的,请告诉我。
推荐阅读
- sql - 使用带有 Quill 连接的过滤查询
- c++ - 在程序中使用 assert 语句时出错
- javascript - 在 Javascript 中转换 16 位 Unicode 十六进制字符串
- r - R Lavaan 包错误:一些潜在变量名称与观察到的变量名称冲突
- html - 溢出的弹性容器没有伸展它的孩子
- excel - vlookup 返回 #N/A
- django - Django Admin - 带有外键和多字段的动态选择选项
- c++ - 错误的输出格式 意外的文件结尾 - 预期 C++ 的令牌 - 什么可能导致这些错误?
- python - 当 False 循环时,将变量设置为 True 不会退出
- javascript - 如何反转此自定义哈希