fix: 自定义页面轮播发现页卡片加载游戏改为使用LiveData实现

This commit is contained in:
叶子维
2024-03-11 15:24:17 +08:00
committed by chenjuntao
parent 44a2f311d4
commit cdfed6359e
3 changed files with 28 additions and 15 deletions

View File

@ -90,7 +90,6 @@ class CustomPageViewModel(
private val subjectChangedMap: ArrayMap<String, List<GameEntity>> = ArrayMap()
var slideDiscoveryGames = emptyList<GameEntity>()
var slideDiscoveryGamesPage = -1
private lateinit var _pageTracker: CustomPageTracker
@ -425,18 +424,21 @@ class CustomPageViewModel(
_changeAppBarColorAction.value = Event(color)
}
override fun loadSlideDiscoverCardGames(homeSubSlide: HomeSubSlide, callback: () -> Unit) {
if (slideDiscoveryGamesPage != homeSubSlide.repeatCount) {
private val _slideDiscoveryCardGames = MutableLiveData<List<GameEntity>>()
val slideDiscoveryCardGames: LiveData<List<GameEntity>> = _slideDiscoveryCardGames
override fun loadSlideDiscoverCardGames(homeSubSlide: HomeSubSlide) {
if (slideDiscoveryGamesPage == homeSubSlide.repeatCount && _slideDiscoveryCardGames.value != null) {
_slideDiscoveryCardGames.postValue(ArrayList(_slideDiscoveryCardGames.value!!))
} else {
repository.loadSlideDiscoverCardGames()
.compose(observableToMain())
.subscribe(object : Response<List<GameEntity>>() {
override fun onResponse(response: List<GameEntity>?) {
response?.let {
SPUtils.setBoolean(Constants.SP_DISCOVER_FORCE_REFRESH, false)
slideDiscoveryGames = it
_slideDiscoveryCardGames.postValue(it)
slideDiscoveryGamesPage = homeSubSlide.repeatCount
homeSubSlide.cardData.games = it
callback.invoke()
}
}
@ -444,9 +446,6 @@ class CustomPageViewModel(
Utils.toast(getApplication(), "网络异常")
}
})
} else {
homeSubSlide.cardData.games = slideDiscoveryGames
callback.invoke()
}
}

View File

@ -5,7 +5,6 @@ import com.gh.gamecenter.entity.HomeSubSlide
import com.gh.gamecenter.entity.RatingComment
import com.gh.gamecenter.entity.SubjectEntity
import com.gh.gamecenter.feature.entity.GameEntity
import com.gh.gamecenter.home.custom.model.CustomDiscoverCardItem
import com.gh.gamecenter.home.custom.model.CustomPageData
import com.gh.gamecenter.home.custom.model.CustomPageItem
import com.gh.gamecenter.home.custom.model.CustomSubjectCollectionItem
@ -33,7 +32,7 @@ interface OnCustomPageEventListener {
fun onChangeAppBarColor(color: Int)
fun loadSlideDiscoverCardGames(homeSubSlide: HomeSubSlide, callback: () -> Unit)
fun loadSlideDiscoverCardGames(homeSubSlide: HomeSubSlide)
/**
* 通过Game进入游戏详情

View File

@ -10,6 +10,7 @@ import androidx.constraintlayout.widget.ConstraintSet
import androidx.core.graphics.ColorUtils
import androidx.core.view.isVisible
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.PagerSnapHelper
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2
@ -48,7 +49,7 @@ import kotlin.math.abs
*/
class CustomHomeSlideWithCardsViewHolder(
viewModel: CustomPageViewModel,
lifecycleOwner: LifecycleOwner,
private val lifecycleOwner: LifecycleOwner,
val binding: HomeSlideWithCardsCustomBinding,
) : BaseCustomViewHolder(viewModel, binding.root), OnCustomPageRefreshStateListener {
@ -97,6 +98,9 @@ class CustomHomeSlideWithCardsViewHolder(
adapter.scrollToNextPage()
}
private var firstSubSlide: HomeSubSlide? = null
private var secondSubSlide: HomeSubSlide? = null
init {
binding.recyclerView.itemAnimator = null
lifecycleOwner.lifecycle.addObserver(bannerController)
@ -271,11 +275,13 @@ class CustomHomeSlideWithCardsViewHolder(
val firstSubSlidePosition = (viewModel.refreshCount * 2) % slideList.size
val secondSubSlidePosition = (viewModel.refreshCount * 2 + 1) % slideList.size
slideList.getOrNull(firstSubSlidePosition)?.let {
firstSubSlide = it
it.sequence = firstSubSlidePosition
it.repeatCount = (viewModel.refreshCount * 2) / slideList.size
bindCard(binding.firstCv, it, pageConfigure.exposureSourceList, 0)
}
slideList.getOrNull(secondSubSlidePosition)?.let {
secondSubSlide = it
it.sequence = secondSubSlidePosition
it.repeatCount = (viewModel.refreshCount * 2 + 1) / slideList.size
bindCard(binding.secondCv, it, pageConfigure.exposureSourceList, 1)
@ -338,9 +344,18 @@ class CustomHomeSlideWithCardsViewHolder(
// 获取发现卡片游戏
if (homeSubSlide.cardType == "game_explore" && homeSubSlide.cardData.games.isEmpty()) {
viewModel.loadSlideDiscoverCardGames(homeSubSlide) {
bindCard(homeSlideCardItemBinding, homeSubSlide, basicExposureSource, position)
}
viewModel.slideDiscoveryCardGames.observe(lifecycleOwner, object : Observer<List<GameEntity>> {
override fun onChanged(t: List<GameEntity>?) {
val currentSubSlide = if (position == 0) firstSubSlide else secondSubSlide
if (t != null && homeSubSlide == currentSubSlide) {
bindCard(homeSlideCardItemBinding, homeSubSlide.apply {
cardData.games = t
}, basicExposureSource, position)
viewModel.slideDiscoveryCardGames.removeObserver(this)
}
}
})
viewModel.loadSlideDiscoverCardGames(homeSubSlide)
return
}