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.base.DynamicLayoutManagerFragment
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.sheets.AddChannelToGroupSheet
import com.github.libretube.util.deArrow
@ -102,10 +103,8 @@ class ChannelFragment : DynamicLayoutManagerFragment() {
fetchChannel()
}
binding.channelRecView.viewTreeObserver.addOnScrollChangedListener {
val binding = _binding ?: return@addOnScrollChangedListener
if (binding.channelRecView.canScrollVertically(1) || isLoading) return@addOnScrollChangedListener
binding.channelRecView.addOnBottomReachedListener {
if (_binding == null || isLoading) return@addOnBottomReachedListener
loadNextPage()
}

View File

@ -17,7 +17,6 @@ import androidx.navigation.fragment.navArgs
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
import com.github.libretube.NavDirections
import com.github.libretube.R
import com.github.libretube.api.PlaylistsHelper
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.ceilHalf
import com.github.libretube.extensions.dpToPx
import com.github.libretube.extensions.toID
import com.github.libretube.extensions.toastFromMainDispatcher
import com.github.libretube.helpers.ImageHelper
import com.github.libretube.helpers.NavigationHelper
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.base.BaseActivity
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.sheets.BaseBottomSheet
import com.github.libretube.ui.sheets.PlaylistOptionsBottomSheet
@ -312,18 +310,16 @@ class PlaylistFragment : DynamicLayoutManagerFragment() {
}
})
binding.playlistRecView.viewTreeObserver.addOnScrollChangedListener {
if (_binding?.playlistRecView?.canScrollVertically(1) == false &&
!isLoading
) {
// append more playlists to the recycler view
if (playlistType != PlaylistType.PUBLIC) {
isLoading = true
playlistAdapter?.showMoreItems()
isLoading = false
} else {
fetchNextPage()
}
binding.playlistRecView.addOnBottomReachedListener {
if (isLoading) return@addOnBottomReachedListener
// append more playlists to the recycler view
if (playlistType != PlaylistType.PUBLIC) {
isLoading = true
playlistAdapter?.showMoreItems()
isLoading = false
} else {
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.VideosAdapter
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.PlayerViewModel
import com.github.libretube.ui.models.SubscriptionsViewModel
@ -134,24 +135,20 @@ class SubscriptionsFragment : DynamicLayoutManagerFragment() {
binding.subFeed.isGone = isCurrentTabSubChannels
}
binding.subChannels.viewTreeObserver.addOnScrollChangedListener {
val binding = _binding
if (binding?.subChannels?.canScrollVertically(1) == false &&
viewModel.subscriptions.value != null && // scroll view is at bottom
isCurrentTabSubChannels
) {
binding.subChannels.addOnBottomReachedListener {
val binding = _binding ?: return@addOnBottomReachedListener
if (viewModel.subscriptions.value != null && isCurrentTabSubChannels) {
binding.subRefresh.isRefreshing = true
channelsAdapter?.updateItems()
binding.subRefresh.isRefreshing = false
}
}
binding.subFeed.viewTreeObserver.addOnScrollChangedListener {
val binding = _binding
if (binding?.subFeed?.canScrollVertically(1) == false &&
viewModel.videoFeed.value != null && // scroll view is at bottom
!isCurrentTabSubChannels
) {
binding.subFeed.addOnBottomReachedListener {
val binding = _binding ?: return@addOnBottomReachedListener
if (viewModel.videoFeed.value != null && !isCurrentTabSubChannels) {
binding.subRefresh.isRefreshing = true
feedAdapter?.updateItems()
binding.subRefresh.isRefreshing = false