refactor: simplify scrolling logic

This commit is contained in:
Bnyro 2024-02-25 14:02:50 +01:00
parent eb4190abd0
commit c493ada148
4 changed files with 32 additions and 31 deletions

View File

@ -0,0 +1,9 @@
package com.github.libretube.ui.extensions
import androidx.recyclerview.widget.RecyclerView
fun RecyclerView.addOnBottomReachedListener(onBottomReached: () -> Unit) {
viewTreeObserver.addOnScrollChangedListener {
if (!canScrollVertically(1)) onBottomReached()
}
}

View File

@ -30,6 +30,7 @@ import com.github.libretube.ui.adapters.SearchChannelAdapter
import com.github.libretube.ui.adapters.VideosAdapter import com.github.libretube.ui.adapters.VideosAdapter
import com.github.libretube.ui.base.DynamicLayoutManagerFragment import com.github.libretube.ui.base.DynamicLayoutManagerFragment
import com.github.libretube.ui.dialogs.ShareDialog import com.github.libretube.ui.dialogs.ShareDialog
import com.github.libretube.ui.extensions.addOnBottomReachedListener
import com.github.libretube.ui.extensions.setupSubscriptionButton import com.github.libretube.ui.extensions.setupSubscriptionButton
import com.github.libretube.ui.sheets.AddChannelToGroupSheet import com.github.libretube.ui.sheets.AddChannelToGroupSheet
import com.github.libretube.util.deArrow import com.github.libretube.util.deArrow
@ -102,10 +103,8 @@ class ChannelFragment : DynamicLayoutManagerFragment() {
fetchChannel() fetchChannel()
} }
binding.channelRecView.viewTreeObserver.addOnScrollChangedListener { binding.channelRecView.addOnBottomReachedListener {
val binding = _binding ?: return@addOnScrollChangedListener if (_binding == null || isLoading) return@addOnBottomReachedListener
if (binding.channelRecView.canScrollVertically(1) || isLoading) return@addOnScrollChangedListener
loadNextPage() loadNextPage()
} }

View File

@ -17,7 +17,6 @@ import androidx.navigation.fragment.navArgs
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.github.libretube.NavDirections
import com.github.libretube.R import com.github.libretube.R
import com.github.libretube.api.PlaylistsHelper import com.github.libretube.api.PlaylistsHelper
import com.github.libretube.api.RetrofitInstance import com.github.libretube.api.RetrofitInstance
@ -31,15 +30,14 @@ import com.github.libretube.enums.PlaylistType
import com.github.libretube.extensions.TAG import com.github.libretube.extensions.TAG
import com.github.libretube.extensions.ceilHalf import com.github.libretube.extensions.ceilHalf
import com.github.libretube.extensions.dpToPx import com.github.libretube.extensions.dpToPx
import com.github.libretube.extensions.toID
import com.github.libretube.extensions.toastFromMainDispatcher import com.github.libretube.extensions.toastFromMainDispatcher
import com.github.libretube.helpers.ImageHelper import com.github.libretube.helpers.ImageHelper
import com.github.libretube.helpers.NavigationHelper import com.github.libretube.helpers.NavigationHelper
import com.github.libretube.helpers.PreferenceHelper import com.github.libretube.helpers.PreferenceHelper
import com.github.libretube.ui.activities.MainActivity
import com.github.libretube.ui.adapters.PlaylistAdapter import com.github.libretube.ui.adapters.PlaylistAdapter
import com.github.libretube.ui.base.BaseActivity import com.github.libretube.ui.base.BaseActivity
import com.github.libretube.ui.base.DynamicLayoutManagerFragment import com.github.libretube.ui.base.DynamicLayoutManagerFragment
import com.github.libretube.ui.extensions.addOnBottomReachedListener
import com.github.libretube.ui.models.PlayerViewModel import com.github.libretube.ui.models.PlayerViewModel
import com.github.libretube.ui.sheets.BaseBottomSheet import com.github.libretube.ui.sheets.BaseBottomSheet
import com.github.libretube.ui.sheets.PlaylistOptionsBottomSheet import com.github.libretube.ui.sheets.PlaylistOptionsBottomSheet
@ -312,18 +310,16 @@ class PlaylistFragment : DynamicLayoutManagerFragment() {
} }
}) })
binding.playlistRecView.viewTreeObserver.addOnScrollChangedListener { binding.playlistRecView.addOnBottomReachedListener {
if (_binding?.playlistRecView?.canScrollVertically(1) == false && if (isLoading) return@addOnBottomReachedListener
!isLoading
) { // append more playlists to the recycler view
// append more playlists to the recycler view if (playlistType != PlaylistType.PUBLIC) {
if (playlistType != PlaylistType.PUBLIC) { isLoading = true
isLoading = true playlistAdapter?.showMoreItems()
playlistAdapter?.showMoreItems() isLoading = false
isLoading = false } else {
} else { fetchNextPage()
fetchNextPage()
}
} }
} }

View File

@ -34,6 +34,7 @@ import com.github.libretube.ui.adapters.LegacySubscriptionAdapter
import com.github.libretube.ui.adapters.SubscriptionChannelAdapter import com.github.libretube.ui.adapters.SubscriptionChannelAdapter
import com.github.libretube.ui.adapters.VideosAdapter import com.github.libretube.ui.adapters.VideosAdapter
import com.github.libretube.ui.base.DynamicLayoutManagerFragment import com.github.libretube.ui.base.DynamicLayoutManagerFragment
import com.github.libretube.ui.extensions.addOnBottomReachedListener
import com.github.libretube.ui.models.EditChannelGroupsModel import com.github.libretube.ui.models.EditChannelGroupsModel
import com.github.libretube.ui.models.PlayerViewModel import com.github.libretube.ui.models.PlayerViewModel
import com.github.libretube.ui.models.SubscriptionsViewModel import com.github.libretube.ui.models.SubscriptionsViewModel
@ -134,24 +135,20 @@ class SubscriptionsFragment : DynamicLayoutManagerFragment() {
binding.subFeed.isGone = isCurrentTabSubChannels binding.subFeed.isGone = isCurrentTabSubChannels
} }
binding.subChannels.viewTreeObserver.addOnScrollChangedListener { binding.subChannels.addOnBottomReachedListener {
val binding = _binding val binding = _binding ?: return@addOnBottomReachedListener
if (binding?.subChannels?.canScrollVertically(1) == false &&
viewModel.subscriptions.value != null && // scroll view is at bottom if (viewModel.subscriptions.value != null && isCurrentTabSubChannels) {
isCurrentTabSubChannels
) {
binding.subRefresh.isRefreshing = true binding.subRefresh.isRefreshing = true
channelsAdapter?.updateItems() channelsAdapter?.updateItems()
binding.subRefresh.isRefreshing = false binding.subRefresh.isRefreshing = false
} }
} }
binding.subFeed.viewTreeObserver.addOnScrollChangedListener { binding.subFeed.addOnBottomReachedListener {
val binding = _binding val binding = _binding ?: return@addOnBottomReachedListener
if (binding?.subFeed?.canScrollVertically(1) == false &&
viewModel.videoFeed.value != null && // scroll view is at bottom if (viewModel.videoFeed.value != null && !isCurrentTabSubChannels) {
!isCurrentTabSubChannels
) {
binding.subRefresh.isRefreshing = true binding.subRefresh.isRefreshing = true
feedAdapter?.updateItems() feedAdapter?.updateItems()
binding.subRefresh.isRefreshing = false binding.subRefresh.isRefreshing = false