diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.kt b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.kt index 6d0822604c..b775142914 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.kt @@ -101,6 +101,7 @@ class ContributionsListFragment : CommonsDaggerSupportFragment(), ContributionsL private var contributionsSize = 0 private var userName: String? = null + private var pendingScrollState: Parcelable? = null private val galleryPickLauncherForResult = registerForActivityResult( StartActivityForResult() @@ -271,7 +272,12 @@ class ContributionsListFragment : CommonsDaggerSupportFragment(), ContributionsL if (list != null) { contributionsSize = list.size } - adapter!!.submitList(list) + adapter!!.submitList(list) { + pendingScrollState?.let { state -> + rvContributionsList?.layoutManager?.onRestoreInstanceState(state) + pendingScrollState = null + } + } if (callback != null) { callback!!.notifyDataSetChanged() } @@ -284,7 +290,8 @@ class ContributionsListFragment : CommonsDaggerSupportFragment(), ContributionsL if (callback != null) { callback!!.notifyDataSetChanged() } - if (itemCount > 0 && positionStart == 0) { + val countBeforeInsertion = adapter!!.itemCount - itemCount + if (itemCount > 0 && positionStart == 0 && countBeforeInsertion > 0) { if (adapter!!.getContributionForPosition(positionStart) != null) { rvContributionsList!! .scrollToPosition(0) //Newly upload items are always added to the top @@ -470,9 +477,8 @@ class ContributionsListFragment : CommonsDaggerSupportFragment(), ContributionsL override fun onViewStateRestored(savedInstanceState: Bundle?) { super.onViewStateRestored(savedInstanceState) if (null != savedInstanceState) { - val savedRecyclerLayoutState = + pendingScrollState = BundleCompat.getParcelable(savedInstanceState, RV_STATE, Parcelable::class.java) - rvContributionsList!!.layoutManager!!.onRestoreInstanceState(savedRecyclerLayoutState) } } diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.kt b/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.kt index d481017b2f..5083bbf9cf 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.kt @@ -359,18 +359,39 @@ after opening the app. } private fun restoreActiveFragment(fragmentName: String) { + val existing = supportFragmentManager.findFragmentById(R.id.fragmentContainer) if (fragmentName == ActiveFragment.CONTRIBUTIONS.name) { title = getString(R.string.contributions_fragment) - loadFragment(newInstance(), false) + if (existing is ContributionsFragment) { + contributionsFragment = existing + activeFragment = ActiveFragment.CONTRIBUTIONS + } else { + loadFragment(newInstance(), false) + } } else if (fragmentName == ActiveFragment.NEARBY.name) { title = getString(R.string.nearby_fragment) - loadFragment(NearbyParentFragment.newInstance(), false) + if (existing is NearbyParentFragment) { + nearbyParentFragment = existing + activeFragment = ActiveFragment.NEARBY + } else { + loadFragment(NearbyParentFragment.newInstance(), false) + } } else if (fragmentName == ActiveFragment.EXPLORE.name) { title = getString(R.string.navigation_item_explore) - loadFragment(ExploreFragment.newInstance(), false) + if (existing is ExploreFragment) { + exploreFragment = existing + activeFragment = ActiveFragment.EXPLORE + } else { + loadFragment(ExploreFragment.newInstance(), false) + } } else if (fragmentName == ActiveFragment.BOOKMARK.name) { title = getString(R.string.bookmarks) - loadFragment(BookmarkFragment.newInstance(), false) + if (existing is BookmarkFragment) { + bookmarkFragment = existing + activeFragment = ActiveFragment.BOOKMARK + } else { + loadFragment(BookmarkFragment.newInstance(), false) + } } }