Przeglądaj źródła

feat: 首页排序

DoggyZhang 3 miesięcy temu
rodzic
commit
2b81b0548a

BIN
app/src/main/res/drawable-xhdpi/common_filter_asc_ic.png


BIN
app/src/main/res/drawable-xhdpi/common_filter_desc_ic.png


BIN
app/src/main/res/drawable-xhdpi/common_filter_ic.png


+ 8 - 2
app/src/main/res/values/strings.xml

@@ -236,8 +236,14 @@
     <string name="image_select_room_cover_select_gif_tip">%1$s Gold ≥80M room open GIF upload privilege (subject to review)</string>
     <string name="image_select_avatar_select_gif_tip">%1$s level ≥50 open GIF upload privilege (subject to review)</string>
     <string name="image_select_room_cover_family">%1$s You have obtained the privilege to upload room animations during family activities (requires review), and the privilege will expire in %2$s. Free upload permission 2 times a week, if more than that, you need to pay additional gold coins</string>
-    <string name="common_score_rank_filter_to_low">评分高到低</string>
-    <string name="common_score_rank_filter_to_high">评分低到高</string>
+
+    <string name="common_star_rank_filter">评分</string>
+    <string name="common_star_rank_filter_to_low">评分高到低</string>
+    <string name="common_star_rank_filter_to_high">评分低到高</string>
+    <string name="common_price_rank_filter">价格</string>
+    <string name="common_price_rank_filter_to_low">价格高到低</string>
+    <string name="common_price_rank_filter_to_high">价格低到高</string>
+
     <string name="common_find_your_partner">Find your partner</string>
     <string name="common_online_play">Online Play</string>
     <string name="common_pc_game">PC Game</string>

+ 0 - 1
module/playmate/src/main/java/com/adealink/weparty/playmate/data/PlaymateData.kt

@@ -1,6 +1,5 @@
 package com.adealink.weparty.playmate.data
 
-import com.adealink.weparty.module.playmate.data.PlaymateCategoryData
 import com.adealink.weparty.module.playmate.data.UserPlaymateCategoryData
 import com.google.gson.annotations.SerializedName
 

+ 12 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/data/PlaymateListData.kt

@@ -6,6 +6,18 @@ import com.google.gson.annotations.GsonNullable
 import com.google.gson.annotations.SerializedName
 
 
+enum class PlaymateListStarSort(val sort: Int){
+    DEFAULT(-1), //默认
+    ASC(0), //升序
+    DESC(1), //降序
+}
+
+enum class PlaymateListPriceSort(val sort: Int){
+    DEFAULT(-1), //默认
+    ASC(0), //升序
+    DESC(1), //降序
+}
+
 data class PlaymateListReq(
     @SerializedName("code") val code: String?, //品类编码
     @SerializedName("page") val page: PageReq, //游标分页查询

+ 25 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/list/GuestPlaymateListFragment.kt

@@ -25,8 +25,11 @@ import com.adealink.weparty.module.playmate.data.TAG_PLAYMATE_LIST
 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.PlaymateListPriceSort
+import com.adealink.weparty.playmate.data.PlaymateListStarSort
 import com.adealink.weparty.playmate.databinding.FragmentPlaymateListBinding
 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.scwang.smart.refresh.layout.api.RefreshLayout
@@ -80,6 +83,22 @@ class GuestPlaymateListFragment : BaseFragment(R.layout.fragment_playmate_list),
         binding.vList.addItemDecoration(VerticalSpaceItemDecoration(10.dp()))
     }
 
+    override fun initComponents() {
+        super.initComponents()
+        PlaymateListFilterComp(
+            this,
+            binding.vListFilter,
+            playmateListViewModel.starRankLD.value ?: PlaymateListStarSort.DEFAULT,
+            playmateListViewModel.priceRankLD.value ?: PlaymateListPriceSort.DEFAULT,
+            {
+                playmateListViewModel.changeStarSort()
+            },
+            {
+                playmateListViewModel.changePriceSort()
+            }
+        ).attach()
+    }
+
 
     fun updateCategory(category: PlaymateCategoryData?) {
         if (!isViewBindingValid()) {
@@ -105,6 +124,12 @@ class GuestPlaymateListFragment : BaseFragment(R.layout.fragment_playmate_list),
 
     override fun observeViewModel() {
         super.observeViewModel()
+        playmateListViewModel.starRankLD.observeWithoutCache(viewLifecycleOwner) {
+            binding.refreshLayout.autoRefresh()
+        }
+        playmateListViewModel.priceRankLD.observeWithoutCache(viewLifecycleOwner) {
+            binding.refreshLayout.autoRefresh()
+        }
         playmateListViewModel.listRltLD.observe(viewLifecycleOwner) { rlt ->
             binding.refreshLayout.finishRefresh()
             binding.refreshLayout.finishLoadMore()

+ 25 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/list/PlaymateListFragment.kt

@@ -24,9 +24,12 @@ import com.adealink.weparty.module.playmate.data.TAG_PLAYMATE_LIST
 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.PlaymateListPriceSort
+import com.adealink.weparty.playmate.data.PlaymateListStarSort
 import com.adealink.weparty.playmate.databinding.FragmentPlaymateListBinding
 import com.adealink.weparty.playmate.findpartner.FindPartnerDialog
 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.scwang.smart.refresh.layout.api.RefreshLayout
@@ -80,6 +83,22 @@ class PlaymateListFragment : BaseFragment(R.layout.fragment_playmate_list),
         binding.vList.addItemDecoration(VerticalSpaceItemDecoration(10.dp()))
     }
 
+    override fun initComponents() {
+        super.initComponents()
+        PlaymateListFilterComp(
+            this,
+            binding.vListFilter,
+            playmateListViewModel.starRankLD.value ?: PlaymateListStarSort.DEFAULT,
+            playmateListViewModel.priceRankLD.value ?: PlaymateListPriceSort.DEFAULT,
+            {
+                playmateListViewModel.changeStarSort()
+            },
+            {
+                playmateListViewModel.changePriceSort()
+            }
+        ).attach()
+    }
+
     private fun findPartner() {
         FindPartnerDialog().show(childFragmentManager, Playmate.FindPartner.PATH)
     }
@@ -108,6 +127,12 @@ class PlaymateListFragment : BaseFragment(R.layout.fragment_playmate_list),
 
     override fun observeViewModel() {
         super.observeViewModel()
+        playmateListViewModel.starRankLD.observeWithoutCache(viewLifecycleOwner) {
+            binding.refreshLayout.autoRefresh()
+        }
+        playmateListViewModel.priceRankLD.observeWithoutCache(viewLifecycleOwner) {
+            binding.refreshLayout.autoRefresh()
+        }
         playmateListViewModel.listRltLD.observe(viewLifecycleOwner) { rlt ->
             binding.refreshLayout.finishRefresh()
             binding.refreshLayout.finishLoadMore()

+ 89 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/list/comp/PlaymateListFilterComp.kt

@@ -0,0 +1,89 @@
+package com.adealink.weparty.playmate.list.comp
+
+import androidx.lifecycle.LifecycleOwner
+import com.adealink.frame.aab.util.getCompatString
+import com.adealink.frame.mvvm.view.ViewComponent
+import com.adealink.frame.mvvm.viewmodel.viewModels
+import com.adealink.frame.util.onClick
+import com.adealink.weparty.playmate.data.PlaymateListPriceSort
+import com.adealink.weparty.playmate.data.PlaymateListStarSort
+import com.adealink.weparty.playmate.databinding.LayoutPlaymateHomeListFilterBinding
+import com.adealink.weparty.playmate.list.viewmodel.PlaymateListViewModel
+import com.adealink.weparty.playmate.viewmodel.PlaymateViewModelFactory
+import com.adealink.weparty.R as APP_R
+
+class PlaymateListFilterComp(
+    lifecycleOwner: LifecycleOwner,
+    val vFilter: LayoutPlaymateHomeListFilterBinding,
+    val initStarSort: PlaymateListStarSort,
+    val initPriceSort: PlaymateListPriceSort,
+    val onStarSortClick: () -> Unit,
+    val onPriceSortClick: () -> Unit,
+) : ViewComponent(lifecycleOwner) {
+
+    private val playmateListViewModel by viewModels<PlaymateListViewModel> { PlaymateViewModelFactory() }
+    override fun onCreate() {
+        super.onCreate()
+        initView()
+        observeViewModel()
+        updateStarFilter(initStarSort)
+        updatePriceFilter(initPriceSort)
+    }
+
+    private fun initView() {
+        vFilter.clStarFilter.onClick {
+            onStarSortClick.invoke()
+        }
+        vFilter.clPriceFilter.onClick {
+            onPriceSortClick.invoke()
+        }
+    }
+
+    private fun observeViewModel() {
+        playmateListViewModel.starRankLD.observe(viewLifecycleOwner) {
+            updateStarFilter(it)
+        }
+        playmateListViewModel.priceRankLD.observe(viewLifecycleOwner) {
+            updatePriceFilter(it)
+        }
+    }
+
+    private fun updateStarFilter(sort: PlaymateListStarSort) {
+        when (sort) {
+            PlaymateListStarSort.ASC -> {
+                vFilter.tvStarRank.text = getCompatString(APP_R.string.common_star_rank_filter_to_high)
+                vFilter.ivStarRank.setImageResource(APP_R.drawable.common_filter_asc_ic)
+            }
+
+            PlaymateListStarSort.DESC -> {
+                vFilter.tvStarRank.text = getCompatString(APP_R.string.common_star_rank_filter_to_low)
+                vFilter.ivStarRank.setImageResource(APP_R.drawable.common_filter_desc_ic)
+            }
+
+            PlaymateListStarSort.DEFAULT -> {
+                vFilter.tvStarRank.text = getCompatString(APP_R.string.common_star_rank_filter)
+                vFilter.ivStarRank.setImageResource(APP_R.drawable.common_filter_ic)
+            }
+        }
+    }
+
+    private fun updatePriceFilter(sort: PlaymateListPriceSort) {
+        when (sort) {
+            PlaymateListPriceSort.ASC -> {
+                vFilter.tvPriceRank.text = getCompatString(APP_R.string.common_price_rank_filter_to_high)
+                vFilter.ivPriceRank.setImageResource(APP_R.drawable.common_filter_asc_ic)
+            }
+
+            PlaymateListPriceSort.DESC -> {
+                vFilter.tvPriceRank.text = getCompatString(APP_R.string.common_price_rank_filter_to_low)
+                vFilter.ivPriceRank.setImageResource(APP_R.drawable.common_filter_desc_ic)
+            }
+
+            PlaymateListPriceSort.DEFAULT -> {
+                vFilter.tvPriceRank.text = getCompatString(APP_R.string.common_price_rank_filter)
+                vFilter.ivPriceRank.setImageResource(APP_R.drawable.common_filter_ic)
+            }
+        }
+    }
+
+}

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

@@ -8,7 +8,9 @@ import com.adealink.frame.network.data.PageReq
 import com.adealink.weparty.App
 import com.adealink.weparty.network.data.NoMoreDataError
 import com.adealink.weparty.playmate.data.PlaymateListData
+import com.adealink.weparty.playmate.data.PlaymateListPriceSort
 import com.adealink.weparty.playmate.data.PlaymateListReq
+import com.adealink.weparty.playmate.data.PlaymateListStarSort
 import com.adealink.weparty.playmate.datasource.remote.PlaymateHttpService
 import com.adealink.weparty.util.PageHandler
 import kotlinx.coroutines.launch
@@ -26,12 +28,52 @@ class PlaymateListViewModel : BaseViewModel() {
     private var categoryCode: String? = null
     private val pageHandler = PageHandler(pageSize = 20)
 
+    val starRankLD = ExtMutableLiveData<PlaymateListStarSort>()
+
+    val priceRankLD = ExtMutableLiveData<PlaymateListPriceSort>()
+
     fun setCategoryCode(code: String?) {
         categoryCode = code
         pageHandler.reset()
         playmateList.clear()
     }
 
+    fun changeStarSort() {
+        val current = starRankLD.value ?: PlaymateListStarSort.DEFAULT
+        val next = when (current) {
+            PlaymateListStarSort.ASC -> {
+                PlaymateListStarSort.DESC
+            }
+
+            PlaymateListStarSort.DESC -> {
+                PlaymateListStarSort.DEFAULT
+            }
+
+            PlaymateListStarSort.DEFAULT -> {
+                PlaymateListStarSort.ASC
+            }
+        }
+        this.starRankLD.send(next)
+    }
+
+    fun changePriceSort() {
+        val current = priceRankLD.value ?: PlaymateListPriceSort.DEFAULT
+        val next = when (current) {
+            PlaymateListPriceSort.ASC -> {
+                PlaymateListPriceSort.DESC
+            }
+
+            PlaymateListPriceSort.DESC -> {
+                PlaymateListPriceSort.DEFAULT
+            }
+
+            PlaymateListPriceSort.DEFAULT -> {
+                PlaymateListPriceSort.ASC
+            }
+        }
+        this.priceRankLD.send(next)
+    }
+
     fun refreshList() {
         viewModelScope.launch {
             pageHandler.reset()
@@ -54,6 +96,10 @@ class PlaymateListViewModel : BaseViewModel() {
         val rlt = playmateHttpService.getPlaymateList(
             PlaymateListReq(
                 code = categoryCode,
+
+                sortByStar = starRankLD.value?.sort ?: PlaymateListStarSort.DEFAULT.sort,
+                sortByPrice = priceRankLD.value?.sort ?: PlaymateListPriceSort.DEFAULT.sort,
+
                 page = PageReq(size = pageHandler.pageSize, next = pageHandler.currentPage)
             )
         )

+ 10 - 8
module/playmate/src/main/res/layout/layout_playmate_home_list_filter.xml

@@ -6,7 +6,7 @@
 
     <!-- 评分 -->
     <androidx.constraintlayout.widget.ConstraintLayout
-        android:id="@+id/cl_rank_filter"
+        android:id="@+id/cl_star_filter"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         app:layout_constraintBottom_toBottomOf="parent"
@@ -14,11 +14,11 @@
         app:layout_constraintTop_toTopOf="parent">
 
         <androidx.appcompat.widget.AppCompatTextView
-            android:id="@+id/tv_score_rank"
+            android:id="@+id/tv_star_rank"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:includeFontPadding="false"
-            android:text="@string/common_score_rank_filter_to_low"
+            android:text="@string/common_star_rank_filter"
             android:textColor="@color/color_FF4E5969"
             android:textSize="11sp"
             app:layout_constraintBottom_toBottomOf="parent"
@@ -26,11 +26,12 @@
             app:layout_constraintTop_toTopOf="parent" />
 
         <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_star_rank"
             android:layout_width="22dp"
             android:layout_height="22dp"
-            app:layout_constraintBottom_toBottomOf="@id/tv_score_rank"
-            app:layout_constraintStart_toEndOf="@id/tv_score_rank"
-            app:layout_constraintTop_toTopOf="@id/tv_score_rank"
+            app:layout_constraintBottom_toBottomOf="@id/tv_star_rank"
+            app:layout_constraintStart_toEndOf="@id/tv_star_rank"
+            app:layout_constraintTop_toTopOf="@id/tv_star_rank"
             app:srcCompat="@drawable/common_filter_ic" />
 
     </androidx.constraintlayout.widget.ConstraintLayout>
@@ -42,7 +43,7 @@
         android:layout_height="wrap_content"
         android:layout_marginStart="6dp"
         app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toEndOf="@id/cl_rank_filter"
+        app:layout_constraintStart_toEndOf="@id/cl_star_filter"
         app:layout_constraintTop_toTopOf="parent">
 
         <androidx.appcompat.widget.AppCompatTextView
@@ -50,7 +51,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:includeFontPadding="false"
-            android:text="@string/common_score_rank_filter_to_low"
+            android:text="@string/common_price_rank_filter"
             android:textColor="@color/color_FF4E5969"
             android:textSize="11sp"
             app:layout_constraintBottom_toBottomOf="parent"
@@ -58,6 +59,7 @@
             app:layout_constraintTop_toTopOf="parent" />
 
         <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_price_rank"
             android:layout_width="22dp"
             android:layout_height="22dp"
             app:layout_constraintBottom_toBottomOf="@id/tv_price_rank"