@@ -39,8 +39,6 @@ class MainFragment : Fragment(R.layout.fragment_main) {
3939 private val viewModel by viewModel<MainViewModel >()
4040 private val router by inject<DiscoveryRouter >()
4141
42- private lateinit var adapter: NavigationFragmentAdapter
43-
4442 override fun onCreate (savedInstanceState : Bundle ? ) {
4543 super .onCreate(savedInstanceState)
4644 lifecycle.addObserver(viewModel)
@@ -89,26 +87,28 @@ class MainFragment : Fragment(R.layout.fragment_main) {
8987 requireArguments().remove(ARG_OPEN_TAB )
9088 }
9189
92- private fun createTabList (openTabArg : String ): List <Pair <Int , Fragment >> {
93- val learnFragment = LearnFragment .newInstance(
94- openTab = if (openTabArg == HomeTab .PROGRAMS .name) {
95- LearnTab .PROGRAMS .name
96- } else {
97- LearnTab .COURSES .name
98- }
99- )
90+ private fun createTabList (openTabArg : String ): List <Pair <Int , () - > Fragment >> {
91+ val learnFragmentFactory = {
92+ LearnFragment .newInstance(
93+ openTab = if (openTabArg == HomeTab .PROGRAMS .name) {
94+ LearnTab .PROGRAMS .name
95+ } else {
96+ LearnTab .COURSES .name
97+ }
98+ )
99+ }
100100
101- return mutableListOf<Pair <Int , Fragment >>().apply {
102- add(R .id.fragmentLearn to learnFragment )
103- add(R .id.fragmentDiscover to viewModel.getDiscoveryFragment)
101+ return mutableListOf<Pair <Int , () - > Fragment >> ().apply {
102+ add(R .id.fragmentLearn to learnFragmentFactory )
103+ add(R .id.fragmentDiscover to { viewModel.getDiscoveryFragment } )
104104 if (viewModel.isDownloadsFragmentEnabled) {
105- add(R .id.fragmentDownloads to DownloadsFragment ())
105+ add(R .id.fragmentDownloads to { DownloadsFragment () } )
106106 }
107- add(R .id.fragmentProfile to ProfileFragment ())
107+ add(R .id.fragmentProfile to { ProfileFragment () } )
108108 }
109109 }
110110
111- private fun addMenuItems (menu : Menu , tabList : List <Pair <Int , Fragment >>) {
111+ private fun addMenuItems (menu : Menu , tabList : List <Pair <Int , () - > Fragment >>) {
112112 val tabTitles = mapOf (
113113 R .id.fragmentLearn to resources.getString(R .string.app_navigation_learn),
114114 R .id.fragmentDiscover to resources.getString(R .string.app_navigation_discovery),
@@ -128,7 +128,7 @@ class MainFragment : Fragment(R.layout.fragment_main) {
128128 }
129129 }
130130
131- private fun setupBottomNavListener (tabList : List <Pair <Int , Fragment >>) {
131+ private fun setupBottomNavListener (tabList : List <Pair <Int , () - > Fragment >>) {
132132 val menuIdToIndex = tabList.mapIndexed { index, pair -> pair.first to index }.toMap()
133133
134134 binding.bottomNavView.setOnItemSelectedListener { menuItem ->
@@ -173,21 +173,21 @@ class MainFragment : Fragment(R.layout.fragment_main) {
173173 } else {
174174 R .id.fragmentLearn
175175 }
176+
176177 HomeTab .PROFILE .name -> R .id.fragmentProfile
177178 else -> R .id.fragmentLearn
178179 }
179180 }
180181
181- private fun initViewPager (tabList : List <Pair <Int , Fragment >>) {
182+ private fun initViewPager (tabList : List <Pair <Int , () - > Fragment >>) {
182183 binding.viewPager.orientation = ViewPager2 .ORIENTATION_HORIZONTAL
183184 binding.viewPager.offscreenPageLimit = tabList.size
184-
185- adapter = NavigationFragmentAdapter ( this ). apply {
186- tabList.forEach { (_, fragment) ->
187- addFragment(fragment)
185+ binding.viewPager.adapter = NavigationFragmentAdapter ( this ). apply {
186+ tabList.forEach { (_, fragmentFactory) ->
187+ // Use fragment factory to prevent memory leaks
188+ addFragment { fragmentFactory() }
188189 }
189190 }
190- binding.viewPager.adapter = adapter
191191 binding.viewPager.isUserInputEnabled = false
192192 }
193193
0 commit comments