Просмотр исходного кода

feat: HomeBaseUserListFragment,列表UI完善

XiaodongLin 1 год назад
Родитель
Сommit
7be47ea371

+ 14 - 31
app/src/main/java/com/adealink/weparty/commonui/recycleview/CustomDividerItemDecoration.kt

@@ -1,41 +1,24 @@
 package com.adealink.weparty.commonui.recycleview
 
-import android.graphics.Canvas
-import android.graphics.Paint
-import androidx.recyclerview.widget.RecyclerView
+import android.content.Context
+import android.graphics.drawable.GradientDrawable
+import androidx.recyclerview.widget.DividerItemDecoration
+import com.adealink.weparty.commonui.drawabletoolbox.DrawableBuilder
 
 /**
  * 自定义分割线颜色+高度
  */
 class CustomDividerItemDecoration(
-    private val dividerHeight: Int,
-    private val dividerColor: Int
-) : RecyclerView.ItemDecoration() {
-
-    private var paint: Paint? = null
-
-    init {
-        paint = Paint().apply {
-            setColor(dividerColor)
-            style = Paint.Style.FILL // 确保填充颜色
-        }
-    }
-
-    override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
-        super.onDraw(c, parent, state)
-
-        val left = parent.paddingLeft
-        val right = parent.width - parent.paddingRight
-
-        for (i in 0 until parent.childCount - 1) {
-            val child = parent.getChildAt(i)
-            val params = child.layoutParams as RecyclerView.LayoutParams
-            val top = child.bottom + params.bottomMargin
-            val bottom = top + dividerHeight
-
-            c.drawRect(left.toFloat(), top.toFloat(), right.toFloat(), bottom.toFloat(), paint!!)
-        }
-
+    context: Context?, orientation: Int
+) : DividerItemDecoration(context, orientation) {
+
+    fun setDivider(dividerHeight: Int, dividerColor: Int) {
+        val dividerDrawable = DrawableBuilder()
+            .shape(GradientDrawable.RECTANGLE)
+            .solidColor(dividerColor)
+            .height(dividerHeight)
+            .build()
+        setDrawable(dividerDrawable)
     }
 
 }

+ 52 - 0
app/src/main/java/com/adealink/weparty/module/profile/view/UserCountryView.kt

@@ -0,0 +1,52 @@
+package com.adealink.weparty.module.profile.view
+
+import android.content.Context
+import android.util.AttributeSet
+import com.adealink.frame.image.view.NetworkImageView
+import com.adealink.weparty.commonui.ext.gone
+import com.adealink.weparty.commonui.ext.show
+import com.adealink.weparty.module.profile.data.UserInfo
+
+/**
+ * Created by XiaoDongLin.
+ * Date: 2025/2/28
+ */
+class UserCountryView @JvmOverloads constructor(
+    context: Context, attrs: AttributeSet? = null
+) : NetworkImageView(context, attrs) {
+
+
+    fun setUserInfo(userInfo: UserInfo?) {
+        //根据用户信息加载国旗
+        if (userInfo == null) {
+            gone()
+            return
+        }
+        if (userInfo.flag?.isNotEmpty() == true) {
+            setCountryUrl(userInfo.flag)
+        } else if (userInfo.country?.isNotEmpty() == true) {
+            setCountryCode(userInfo.country)
+        } else {
+            gone()
+        }
+    }
+
+    fun setCountryUrl(countryUrl: String?) {
+        if (countryUrl.isNullOrEmpty()) {
+            gone()
+            return
+        }
+        show()
+        setImageUrl(countryUrl)
+    }
+
+    fun setCountryCode(countryCode: String?) {
+        //todo:根据国家代码加载国旗
+        if (countryCode.isNullOrEmpty()) {
+            gone()
+            return
+        }
+//        setImageUrl("https://www.countryflags.io/$countryCode/flat/64.png")
+    }
+
+}

+ 39 - 19
app/src/main/java/com/adealink/weparty/module/userlist/UserFilterDialog.kt

@@ -4,6 +4,7 @@ import android.os.Bundle
 import android.os.Parcelable
 import androidx.fragment.app.activityViewModels
 import com.adealink.frame.aab.util.getCompatColor
+import com.adealink.frame.base.fastLazy
 import com.adealink.frame.log.Log
 import com.adealink.frame.mvvm.view.viewBinding
 import com.adealink.frame.util.onClick
@@ -12,6 +13,8 @@ import com.adealink.weparty.commonui.ext.dp
 import com.adealink.weparty.commonui.widget.BottomDialogFragment
 import com.adealink.weparty.databinding.DialogUserFilterBinding
 import com.adealink.weparty.module.profile.data.Gender
+import com.adealink.weparty.module.userlist.UserFilterData.Companion.DEFAULT_MAX_AGE
+import com.adealink.weparty.module.userlist.UserFilterData.Companion.DEFAULT_MIN_AGE
 import com.adealink.weparty.module.userlist.viewmodel.HomeUserListViewModel
 import com.jaygoo.widget.OnRangeChangedListener
 import com.jaygoo.widget.RangeSeekBar
@@ -26,8 +29,8 @@ import kotlinx.parcelize.Parcelize
 @Parcelize
 data class UserFilterData(
     val gender: Gender = Gender.NO_INIT,
-    val minAge: Int = 0,
-    val maxAge: Int = 0
+    val minAge: Int = DEFAULT_MIN_AGE,
+    val maxAge: Int = DEFAULT_MAX_AGE
 ) : Parcelable {
 
     fun isDefault(): Boolean {
@@ -35,10 +38,13 @@ data class UserFilterData(
     }
 
     companion object {
+        val DEFAULT_MIN_AGE = 18
+        val DEFAULT_MAX_AGE = 50
+
         val defaultFilterData = UserFilterData(
             gender = Gender.NO_INIT,
-            minAge = 18,
-            maxAge = 50
+            minAge = DEFAULT_MIN_AGE,
+            maxAge = DEFAULT_MAX_AGE
         )
     }
 }
@@ -50,9 +56,7 @@ class UserFilterDialog : BottomDialogFragment(R.layout.dialog_user_filter) {
 
         fun newInstance(): UserFilterDialog {
             return UserFilterDialog().apply {
-                arguments = Bundle().apply {
-
-                }
+                arguments = Bundle().apply {}
             }
         }
     }
@@ -66,15 +70,26 @@ class UserFilterDialog : BottomDialogFragment(R.layout.dialog_user_filter) {
 
     private val homeUserListViewModel by activityViewModels<HomeUserListViewModel>()
 
+    private val initFilterData by fastLazy {
+        homeUserListViewModel.filterData.value ?: UserFilterData.defaultFilterData
+    }
+
+    private var leftProgressValue = DEFAULT_MIN_AGE
+    private var rightProgressValue = DEFAULT_MAX_AGE
+
     override fun initViews() {
         super.initViews()
         binding.btnConfim.onClick {
             val gender = if (binding.femaleLayout.isSelected) Gender.FEMALE else Gender.MALE
 
+            val newFilterData = initFilterData.copy(
+                gender = gender,
+                minAge = leftProgressValue,
+                maxAge = rightProgressValue
+            )
+
             homeUserListViewModel.selectData(
-                filterData = UserFilterData(
-                    gender = gender,
-                )
+                filterData = newFilterData
             )
 
             dismiss()
@@ -84,15 +99,6 @@ class UserFilterDialog : BottomDialogFragment(R.layout.dialog_user_filter) {
             dismiss()
         }
 
-        homeUserListViewModel.filterData.observe(viewLifecycleOwner) { filterData ->
-            selectGender(filterData.gender)
-            binding.ageRangeSlider.setValue(
-                filterData.minAge.toFloat(),
-                filterData.maxAge.toFloat()
-            )
-        }
-
-
         binding.maleLayout.onClick {
             selectGender(Gender.MALE)
         }
@@ -107,6 +113,8 @@ class UserFilterDialog : BottomDialogFragment(R.layout.dialog_user_filter) {
                 isFromUser: Boolean
             ) {
                 Log.d(TAG, "onRangeChanged: $leftValue, $rightValue")
+                leftProgressValue = leftValue.toInt()
+                rightProgressValue = rightValue.toInt()
             }
 
             override fun onStartTrackingTouch(view: RangeSeekBar?, isLeft: Boolean) {
@@ -119,6 +127,18 @@ class UserFilterDialog : BottomDialogFragment(R.layout.dialog_user_filter) {
 
     }
 
+    override fun loadData() {
+        super.loadData()
+
+
+        selectGender(initFilterData.gender)
+        binding.ageRangeSlider.setValue(
+            initFilterData.minAge.toFloat(),
+            initFilterData.maxAge.toFloat()
+        )
+
+    }
+
     private fun selectGender(gender: Gender?) {
         when (gender) {
             Gender.FEMALE -> {

+ 5 - 0
app/src/main/java/com/adealink/weparty/module/userlist/binder/UserInfoItemViewBinder.kt

@@ -6,6 +6,7 @@ import androidx.lifecycle.LifecycleOwner
 import com.adealink.weparty.commonui.recycleview.adapter.BindingViewHolder
 import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinder
 import com.adealink.weparty.databinding.ItemHomeUserInfoBinding
+import com.adealink.weparty.module.level.util.updateSVipLabel
 import com.adealink.weparty.module.userlist.data.UserInfoItemData
 
 /**
@@ -29,7 +30,11 @@ class UserInfoItemViewBinder(val lifecycleOwner: LifecycleOwner) :
         holder.binding.apply {
             ivAvatar.setImageUrl(item.userInfo.url)
             tvUserName.text = item.userInfo.name
+            userSexView.setUserInfo(item.userInfo)
 
+            updateSVipLabel(5, ivSvipLevel)
+            userCountryView.setUserInfo(item.userInfo.copy(flag = "http://wayak-resource.wenext.media/national_flag/Egypt.png"))
+            tvIntroduction.text = "Happy New Year to you all"
         }
 
     }

+ 1 - 2
app/src/main/java/com/adealink/weparty/module/userlist/fragment/HomeBaseUserListFragment.kt

@@ -51,8 +51,7 @@ abstract class HomeBaseUserListFragment : BaseLazyFragment(R.layout.layout_home_
         binding.rvUserList.apply {
             layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
             adapter = listAdapter
-//            addItemDecoration(VerticalSpaceItemDecoration(6.dp()))
-            addItemDecoration(CustomDividerItemDecoration(dividerHeight = 6.dp(), dividerColor = getCompatColor(R.color.color_FFF7F7F7) ))
+
         }
 
         binding.refreshLayout.setOnRefreshListener {

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


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


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


BIN
app/src/main/res/drawable-xhdpi/rsb_indicator_drawable.9.png


+ 5 - 0
app/src/main/res/drawable/common_ic_filter_state.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/common_ic_filter_selected" android:state_selected="true" />
+    <item android:drawable="@drawable/common_ic_filter" />
+</selector>

+ 3 - 3
app/src/main/res/layout/dialog_user_filter.xml

@@ -116,23 +116,23 @@
         app:rsb_max="50"
 
         app:rsb_progress_height="4dp"
+        app:rsb_progress_default_color="@color/color_F5F7FA"
 
         app:rsb_progress_color="#FF50AE"
         app:rsb_thumb_drawable="@drawable/ic_age_thumb_drawable"
         app:rsb_thumb_size="28dp"
 
+        app:rsb_tick_mark_gravity="center"
         app:rsb_tick_mark_mode="number"
         app:rsb_tick_mark_text_margin="15dp"
 
         app:rsb_indicator_drawable="@drawable/rsb_indicator_drawable"
         app:rsb_indicator_text_color="#FF50AE"
         app:rsb_indicator_text_size="12sp"
-        app:rsb_indicator_height="18dp"
+        app:rsb_indicator_height="20dp"
         app:rsb_indicator_padding_left="6dp"
         app:rsb_indicator_padding_right="6dp"
-        app:rsb_indicator_padding_bottom="4dp"
         app:rsb_indicator_show_mode="showWhenTouch"
-        app:rsb_indicator_margin="6dp"
 
         />
 

+ 2 - 2
app/src/main/res/layout/fragment_home_user_list.xml

@@ -15,7 +15,6 @@
         android:id="@+id/cl_top"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginHorizontal="16dp"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@id/space_status_bar">
 
@@ -37,7 +36,8 @@
             android:id="@+id/btn_filter"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:src="@drawable/common_ic_filter"
+            android:layout_marginEnd="16dp"
+            android:background="@drawable/common_ic_filter_state"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintTop_toTopOf="parent" />

+ 56 - 6
app/src/main/res/layout/item_home_user_info.xml

@@ -3,16 +3,22 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
-    android:layout_height="98dp"
+    android:layout_height="104dp"
     android:background="@color/white">
 
+    <View
+        android:id="@+id/bottom_divider"
+        android:layout_width="match_parent"
+        android:layout_height="6dp"
+        android:background="@color/color_FFF7F7F7"
+        app:layout_constraintBottom_toBottomOf="parent" />
 
     <FrameLayout
         android:id="@+id/avatar_layout"
         android:layout_width="78dp"
         android:layout_height="78dp"
         android:layout_marginStart="14dp"
-        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintBottom_toTopOf="@id/bottom_divider"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent">
 
@@ -22,6 +28,20 @@
             android:layout_height="66dp"
             android:layout_gravity="center" />
 
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_in_room"
+            android:layout_width="71dp"
+            android:layout_height="71dp"
+            android:layout_gravity="center"
+            android:background="@drawable/ic_in_room_avatar_border" />
+
+        <androidx.appcompat.widget.AppCompatImageView
+            android:id="@+id/iv_in_room_fg"
+            android:layout_width="66dp"
+            android:layout_height="66dp"
+            android:layout_gravity="center"
+            android:background="@drawable/ic_in_room_avatar_border_fg" />
+
         <androidx.appcompat.widget.AppCompatImageView
             android:id="@+id/iv_online"
             android:layout_width="10dp"
@@ -30,6 +50,7 @@
             android:layout_marginTop="8dp"
             android:layout_marginEnd="13dp"
             android:background="@drawable/common_online_ic" />
+
     </FrameLayout>
 
 
@@ -71,11 +92,40 @@
         app:layout_constraintStart_toEndOf="@+id/avatar_layout"
         app:layout_constraintTop_toBottomOf="@+id/tv_user_name">
 
-        <androidx.appcompat.widget.LinearLayoutCompat
+        <androidx.constraintlayout.widget.ConstraintLayout
             android:layout_width="wrap_content"
             android:layout_height="wrap_content">
 
-        </androidx.appcompat.widget.LinearLayoutCompat>
+            <com.adealink.weparty.module.profile.view.UserCountryView
+                android:id="@+id/user_country_view"
+                android:layout_width="16dp"
+                android:layout_height="16dp"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <com.adealink.weparty.module.profile.view.UserSexView
+                android:id="@+id/user_sex_view"
+                android:layout_width="wrap_content"
+                android:layout_height="15dp"
+                android:layout_marginStart="4dp"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintStart_toEndOf="@+id/user_country_view"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <com.adealink.frame.image.view.NetworkImageView
+                android:id="@+id/iv_svip_level"
+                android:layout_width="0dp"
+                android:layout_height="18dp"
+                android:layout_marginStart="4dp"
+                android:visibility="gone"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintDimensionRatio="376:148"
+                app:layout_constraintStart_toEndOf="@+id/user_sex_view"
+                app:layout_constraintTop_toTopOf="parent" />
+
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
 
     </HorizontalScrollView>
 
@@ -87,7 +137,7 @@
         android:textColor="@color/color_AAAAAA"
         android:textSize="11sp"
         app:layout_constrainedWidth="true"
-        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintBottom_toTopOf="@+id/bottom_divider"
         app:layout_constraintEnd_toStartOf="@+id/barrier_right"
         app:layout_constraintHorizontal_bias="0"
         app:layout_constraintStart_toEndOf="@+id/avatar_layout"
@@ -107,7 +157,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginEnd="16dp"
-        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintBottom_toTopOf="@+id/bottom_divider"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 

+ 5 - 3
module/moment/src/main/java/com/adealink/weparty/moment/usermoment/msg/MomentMessageListActivity.kt

@@ -50,9 +50,11 @@ class MomentMessageListActivity : BaseActivity() {
         binding.rvLikeList.apply {
             addItemDecoration(
                 CustomDividerItemDecoration(
-                    dividerHeight = dividerHeight,
-                    dividerColor = dividerColor
-                )
+                    context,
+                    LinearLayoutManager.VERTICAL
+                ).apply {
+                    setDivider(dividerHeight, dividerColor)
+                }
             )
             layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
             adapter = messageListAdapter

+ 5 - 3
module/moment/src/main/java/com/adealink/weparty/moment/usermoment/square/MomentListFragment.kt

@@ -133,9 +133,11 @@ class MomentListFragment : BaseLazyFragment(R.layout.fragment_moment_square), Re
         binding.rvMoment.apply {
             addItemDecoration(
                 CustomDividerItemDecoration(
-                    dividerHeight = dividerHeight,
-                    dividerColor = dividerColor
-                )
+                    context,
+                    LinearLayoutManager.VERTICAL
+                ).apply {
+                    setDivider(dividerHeight, dividerColor)
+                }
             )
             itemAnimator = null
             layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)