Răsfoiți Sursa

feat: 游客态展示Banner

DoggyZhang 19 ore în urmă
părinte
comite
febcbeaaaf

+ 11 - 6
module/playmate/src/main/java/com/adealink/weparty/playmate/list/GuestPlaymateListFragment.kt

@@ -18,19 +18,21 @@ import com.adealink.weparty.commonui.ext.dp
 import com.adealink.weparty.commonui.ext.gone
 import com.adealink.weparty.commonui.ext.show
 import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
+import com.adealink.weparty.commonui.recycleview.diffutil.BaseListItemData
 import com.adealink.weparty.commonui.recycleview.itemdecoration.VerticalSpaceItemDecoration
 import com.adealink.weparty.commonui.toast.util.showFailedToast
 import com.adealink.weparty.module.account.AccountModule
+import com.adealink.weparty.module.activity.data.BannerData
 import com.adealink.weparty.module.playmate.Playmate
 import com.adealink.weparty.module.playmate.data.PlaymateCategoryData
 import com.adealink.weparty.module.playmate.data.TAG_PLAYMATE_LIST
 import com.adealink.weparty.network.data.NoMoreDataError
 import com.adealink.weparty.playmate.R
 import com.adealink.weparty.playmate.data.PlaymateListData
-import com.adealink.weparty.playmate.data.PlaymateListItemData
 import com.adealink.weparty.playmate.data.PriceSort
 import com.adealink.weparty.playmate.data.StarOption
 import com.adealink.weparty.playmate.databinding.FragmentPlaymateListBinding
+import com.adealink.weparty.playmate.list.adapter.PlaymateBannerItemViewBinder
 import com.adealink.weparty.playmate.list.adapter.PlaymateListItemViewBinder
 import com.adealink.weparty.playmate.list.comp.PlaymateListFilterComp
 import com.adealink.weparty.playmate.list.viewmodel.GuestPlaymateListViewModel
@@ -42,7 +44,8 @@ import com.adealink.weparty.R as APP_R
 
 @RouterUri(path = [Playmate.List.GUEST_PATH], desc = "(游客)陪玩列表")
 class GuestPlaymateListFragment : BaseFragment(R.layout.fragment_playmate_list),
-    PlaymateListItemViewBinder.OnPlaymateListListener {
+    PlaymateListItemViewBinder.OnPlaymateListListener,
+    PlaymateBannerItemViewBinder.OnBannerListener {
 
     override val isLazyInit: Boolean = true
     override val isLazyLoad: Boolean = true
@@ -54,7 +57,7 @@ class GuestPlaymateListFragment : BaseFragment(R.layout.fragment_playmate_list),
     var category: PlaymateCategoryData? = null
 
     private val binding by viewBinding(FragmentPlaymateListBinding::bind)
-    private val listAdapter by fastLazy { MultiTypeListAdapter<PlaymateListItemData>() }
+    private val listAdapter by fastLazy { MultiTypeListAdapter<BaseListItemData>() }
     private val playmateListViewModel by viewModels<GuestPlaymateListViewModel> { PlaymateViewModelFactory() }
 
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -91,6 +94,7 @@ class GuestPlaymateListFragment : BaseFragment(R.layout.fragment_playmate_list),
         })
 
         listAdapter.register(PlaymateListItemViewBinder(this, this))
+        listAdapter.register(PlaymateBannerItemViewBinder(this, this))
         binding.vList.adapter = listAdapter
         binding.vList.layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
         binding.vList.addItemDecoration(VerticalSpaceItemDecoration(10.dp()))
@@ -167,9 +171,7 @@ class GuestPlaymateListFragment : BaseFragment(R.layout.fragment_playmate_list),
                 binding.vList.show()
                 binding.vErrorView.gone()
             }
-            listAdapter.submitList(list.map { data ->
-                PlaymateListItemData(data)
-            })
+            listAdapter.submitList(list)
         }
     }
 
@@ -177,5 +179,8 @@ class GuestPlaymateListFragment : BaseFragment(R.layout.fragment_playmate_list),
         AccountModule.showLoginDialog(activity?.supportFragmentManager)
     }
 
+    override fun goBanner(bannerInfo: BannerData) {
+        AccountModule.showLoginDialog(activity?.supportFragmentManager)
+    }
 
 }

+ 11 - 2
module/playmate/src/main/java/com/adealink/weparty/playmate/list/PlaymateListFragment.kt

@@ -22,6 +22,7 @@ import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
 import com.adealink.weparty.commonui.recycleview.diffutil.BaseListItemData
 import com.adealink.weparty.commonui.recycleview.itemdecoration.VerticalSpaceItemDecoration
 import com.adealink.weparty.commonui.toast.util.showFailedToast
+import com.adealink.weparty.module.activity.data.BannerData
 import com.adealink.weparty.module.playmate.Playmate
 import com.adealink.weparty.module.playmate.data.PlaymateCategoryData
 import com.adealink.weparty.module.playmate.data.TAG_PLAYMATE_LIST
@@ -43,6 +44,7 @@ import com.adealink.weparty.playmate.list.adapter.PlaymateListItemViewBinder
 import com.adealink.weparty.playmate.list.comp.PlaymateListFilterComp
 import com.adealink.weparty.playmate.list.viewmodel.PlaymateListViewModel
 import com.adealink.weparty.playmate.viewmodel.PlaymateViewModelFactory
+import com.adealink.weparty.util.goLocalLinkPage
 import com.adealink.weparty.util.parcelableExtra
 import com.scwang.smart.refresh.layout.api.RefreshLayout
 import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
@@ -50,7 +52,8 @@ import com.tencent.qcloud.tuikit.tuichat.component.audio.AudioPlayer
 import com.adealink.weparty.R as APP_R
 
 class PlaymateListFragment : BaseFragment(R.layout.fragment_playmate_list),
-    PlaymateListItemViewBinder.OnPlaymateListListener {
+    PlaymateListItemViewBinder.OnPlaymateListListener,
+    PlaymateBannerItemViewBinder.OnBannerListener {
 
     @BindExtra(Playmate.Common.EXTRA_FIRST_CATEGORY_CODE)
     var firstCategoryCode: String? = null
@@ -167,7 +170,7 @@ class PlaymateListFragment : BaseFragment(R.layout.fragment_playmate_list),
         })
 
         listAdapter.register(PlaymateListItemViewBinder(this, this))
-        listAdapter.register(PlaymateBannerItemViewBinder(this))
+        listAdapter.register(PlaymateBannerItemViewBinder(this, this))
         binding.vList.adapter = listAdapter
         binding.vList.layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
         binding.vList.addItemDecoration(
@@ -275,5 +278,11 @@ class PlaymateListFragment : BaseFragment(R.layout.fragment_playmate_list),
         }
     }
 
+    override fun goBanner(bannerInfo: BannerData) {
+        activity?.let {
+            goLocalLinkPage(it, bannerInfo.getJumpUrl())
+        }
+    }
+
 
 }

+ 6 - 5
module/playmate/src/main/java/com/adealink/weparty/playmate/list/adapter/PlaymateBannerItemViewBinder.kt

@@ -8,7 +8,6 @@ import com.adealink.frame.base.fastLazy
 import com.adealink.weparty.R
 import com.adealink.weparty.commonui.ext.dp
 import com.adealink.weparty.commonui.ext.dpf
-import com.adealink.weparty.commonui.ext.getActivity
 import com.adealink.weparty.commonui.recycleview.adapter.BindingViewHolder
 import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinder
 import com.adealink.weparty.commonui.widget.banner.indicator.CircleIndicator
@@ -16,10 +15,10 @@ import com.adealink.weparty.module.activity.banner.adapter.ImageBannerAdapter
 import com.adealink.weparty.module.activity.data.BannerData
 import com.adealink.weparty.playmate.data.PlaymateBannerItemData
 import com.adealink.weparty.playmate.databinding.ItemPlaymateHomeBannerBinding
-import com.adealink.weparty.util.goLocalLinkPage
 
 class PlaymateBannerItemViewBinder(
     val lifecycleOwner: LifecycleOwner,
+    val listener: OnBannerListener
 ) : ItemViewBinder<PlaymateBannerItemData, PlaymateBannerItemViewBinder.ViewHolder>() {
 
     override fun onCreateViewHolder(
@@ -59,9 +58,7 @@ class PlaymateBannerItemViewBinder(
                 indicator.indicatorConfig.indicatorSpace = 3.dp()
                 setOnBannerListener { data, _ ->
                     val bannerInfo = data as? BannerData ?: return@setOnBannerListener
-                    getActivity()?.let { activity ->
-                        goLocalLinkPage(activity, bannerInfo.getJumpUrl())
-                    }
+                    listener.goBanner(bannerInfo)
                 }
             }
         }
@@ -71,4 +68,8 @@ class PlaymateBannerItemViewBinder(
             bannerAdapter.setDatas(item.banners)
         }
     }
+
+    interface OnBannerListener {
+        fun goBanner(bannerInfo: BannerData)
+    }
 }

+ 46 - 3
module/playmate/src/main/java/com/adealink/weparty/playmate/list/viewmodel/GuestPlaymateListViewModel.kt

@@ -6,8 +6,14 @@ import com.adealink.frame.mvvm.livedata.ExtMutableLiveData
 import com.adealink.frame.mvvm.viewmodel.BaseViewModel
 import com.adealink.frame.network.data.PageReq
 import com.adealink.weparty.App
+import com.adealink.weparty.commonui.recycleview.diffutil.BaseListItemData
+import com.adealink.weparty.module.activity.ActivityModule
+import com.adealink.weparty.module.activity.data.Banner
+import com.adealink.weparty.module.activity.data.BannerData
 import com.adealink.weparty.network.data.NoMoreDataError
+import com.adealink.weparty.playmate.data.PlaymateBannerItemData
 import com.adealink.weparty.playmate.data.PlaymateListData
+import com.adealink.weparty.playmate.data.PlaymateListItemData
 import com.adealink.weparty.playmate.data.PlaymateListReq
 import com.adealink.weparty.playmate.data.PriceSort
 import com.adealink.weparty.playmate.data.StarOption
@@ -30,7 +36,10 @@ class GuestPlaymateListViewModel : BaseViewModel() {
         App.instance.networkService.getHttpService(PlaymateHttpService::class.java)
     }
 
-    val listLD = MutableLiveData<List<PlaymateListData>>()
+    private var showBanner = true
+    private var bannerList: List<BannerData>? = null
+
+    val listLD = MutableLiveData<List<BaseListItemData>>()
     val listRltLD = ExtMutableLiveData<Rlt<Any>>()
 
     private var firstCategoryCode: String? = null
@@ -87,13 +96,31 @@ class GuestPlaymateListViewModel : BaseViewModel() {
             if (cache) {
                 if (playmateList.isNotEmpty()) {
                     listRltLD.send(Rlt.Success(Unit))
-                    listLD.send(playmateList)
+                    notifyListChanged()
                     return@launch
                 }
             }
             pageHandler.reset()
             playmateList.clear()
             pullList()
+            if (showBanner) {
+                pullBanner()
+            }
+        }
+    }
+
+    private fun pullBanner() {
+        viewModelScope.launch {
+            when (val rlt = ActivityModule.pullBanners(Banner.HOME)) {
+                is Rlt.Failed -> {
+                    this@GuestPlaymateListViewModel.bannerList = null
+                }
+
+                is Rlt.Success -> {
+                    this@GuestPlaymateListViewModel.bannerList = rlt.data
+                }
+            }
+            notifyListChanged()
         }
     }
 
@@ -132,8 +159,24 @@ class GuestPlaymateListViewModel : BaseViewModel() {
                 pageHandler.nextPage(rlt.data.data?.next)
                 playmateList.addAll(rlt.data.data?.list ?: emptyList())
                 listRltLD.send(rlt)
-                listLD.send(playmateList)
+                notifyListChanged()
+            }
+        }
+    }
+
+    private fun notifyListChanged() {
+        viewModelScope.launch {
+            val itemList = mutableListOf<BaseListItemData>()
+            itemList.addAll(playmateList.map { PlaymateListItemData(it) })
+
+            //banner
+            if (showBanner) {
+                val bannerList = this@GuestPlaymateListViewModel.bannerList
+                if (!bannerList.isNullOrEmpty()) {
+                    itemList.add(1, PlaymateBannerItemData(bannerList))
+                }
             }
+            listLD.send(itemList)
         }
     }