DoggyZhang 3 недель назад
Родитель
Сommit
3a513ec9d7

+ 12 - 11
app/src/main/java/com/adealink/weparty/commonui/ext/ViewExt.kt

@@ -21,14 +21,13 @@ import android.view.animation.Interpolator
 import androidx.core.view.ViewCompat
 import androidx.core.view.WindowCompat
 import androidx.core.view.WindowInsetsCompat
-import androidx.fragment.app.findFragment
+import androidx.core.view.doOnAttach
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.findViewTreeLifecycleOwner
 import androidx.recyclerview.widget.RecyclerView
 import com.adealink.frame.util.runOnUiThread
 import com.adealink.weparty.commonui.BaseActivity
-import com.adealink.weparty.commonui.BaseFragment
 
 fun View.getActivity(): BaseActivity? {
     var context = context
@@ -270,14 +269,16 @@ fun Window.fitSystemWindows(decorFitsSystemWindows: Boolean) {
     WindowCompat.setDecorFitsSystemWindows(this, decorFitsSystemWindows)
 }
 
-fun View.findFragmentActivityLifecycleOwner(): LifecycleOwner? {
-    val fragment = findFragment<BaseFragment>()
-    if (fragment != null) {
-        return fragment
+fun View.findViewTreeLifecycleOwnerWhenAttach(callback: (owner: LifecycleOwner?) -> Unit) {
+    if (isAttachedToWindow) {
+        callback.invoke(
+            findViewTreeLifecycleOwner()
+        )
+        return
     }
-    val activity = getActivity()
-    if (activity != null) {
-        return activity
+    doOnAttach {
+        callback.invoke(
+            findViewTreeLifecycleOwner()
+        )
     }
-    return null
-}
+}

+ 4 - 1
app/src/main/java/com/adealink/weparty/module/order/data/DiscountData.kt

@@ -9,7 +9,6 @@ import com.adealink.weparty.module.order.OrderModule
 val discountLD = ExtMutableLiveData<OrderDiscountInfo?>()
 
 fun observeDiscount(owner: LifecycleOwner, observer: Observer<OrderDiscountInfo?>) {
-    unObserveDiscount(owner)
     discountLD.observeWithoutCache(owner, observer)
 }
 
@@ -17,6 +16,10 @@ fun unObserveDiscount(owner: LifecycleOwner) {
     discountLD.removeObservers(owner)
 }
 
+fun unObserveDiscount(observer: Observer<OrderDiscountInfo?>) {
+    discountLD.removeObserver(observer)
+}
+
 data class FinalPrice(
     val originPrice: Float, //原始价格
     val discountPrice: Float, //折扣价格

+ 4 - 3
app/src/main/java/com/adealink/weparty/module/widget/form/field/picture/adapter/PictureItemViewBinder.kt

@@ -2,8 +2,8 @@ package com.adealink.weparty.module.widget.form.field.picture.adapter
 
 import android.view.LayoutInflater
 import android.view.ViewGroup
-import androidx.lifecycle.findViewTreeLifecycleOwner
 import com.adealink.frame.util.onClick
+import com.adealink.weparty.commonui.ext.findViewTreeLifecycleOwnerWhenAttach
 import com.adealink.weparty.commonui.recycleview.adapter.BindingViewHolder
 import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinder
 import com.adealink.weparty.databinding.WidgetPicturePictureItemBinding
@@ -33,8 +33,9 @@ class PictureItemViewBinder(
         } else {
             holder.binding.ivPicture.setImageUrl(null)
         }
-        holder.binding.root.findViewTreeLifecycleOwner()?.let {
-            holder.binding.vUploadProgress.observeProgress(it, item.data.mediaUpload)
+        holder.binding.root.findViewTreeLifecycleOwnerWhenAttach { owner ->
+            owner ?: return@findViewTreeLifecycleOwnerWhenAttach
+            holder.binding.vUploadProgress.observeProgress(owner, item.data.mediaUpload)
         }
     }
 

+ 13 - 7
module/order/src/main/java/com/adealink/weparty/order/dialog/CreateOrderFromCategoryDialog.kt

@@ -27,7 +27,8 @@ import com.adealink.weparty.order.dialog.adapter.CategoryItemViewBinder
 import com.adealink.weparty.order.dialog.adapter.CategoryListItemData
 
 @RouterUri(path = [Order.CreateFromCategory.PATH], desc = "根据用户品列创建订单")
-class CreateOrderFromCategoryDialog : BottomDialogFragment(R.layout.dialog_create_order_from_category) {
+class CreateOrderFromCategoryDialog :
+    BottomDialogFragment(R.layout.dialog_create_order_from_category) {
 
     @BindExtra(Order.CreateFromCategory.EXTRA_TITLE)
     var title: String? = null
@@ -54,13 +55,18 @@ class CreateOrderFromCategoryDialog : BottomDialogFragment(R.layout.dialog_creat
         super.initViews()
         binding.tvTitle.text = title
         binding.rvCategory.adapter = listAdapter
-        binding.rvCategory.layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
+        binding.rvCategory.layoutManager =
+            LinearLayoutManager(context, RecyclerView.VERTICAL, false)
         binding.rvCategory.addItemDecoration(VerticalSpaceItemDecoration(8.dp()))
-        listAdapter.register(CategoryItemViewBinder(object : CategoryItemViewBinder.CategoryChooseListener {
-            override fun onChoose(data: CategoryListItemData, positon: Int) {
-                onCategorySelect(data, positon)
-            }
-        }))
+        listAdapter.register(
+            CategoryItemViewBinder(
+                this@CreateOrderFromCategoryDialog,
+                object : CategoryItemViewBinder.CategoryChooseListener {
+                    override fun onChoose(data: CategoryListItemData, positon: Int) {
+                        onCategorySelect(data, positon)
+                    }
+                })
+        )
 
         binding.vNumber.setNumber(orderCount)
         binding.vNumber.setListener(object : NumberIncreaseView.OnNumberChangedListener {

+ 14 - 5
module/order/src/main/java/com/adealink/weparty/order/dialog/adapter/CategoryItemViewBinder.kt

@@ -2,8 +2,8 @@ package com.adealink.weparty.order.dialog.adapter
 
 import android.view.LayoutInflater
 import android.view.ViewGroup
+import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.Observer
-import androidx.lifecycle.findViewTreeLifecycleOwner
 import com.adealink.frame.aab.util.getCompatString
 import com.adealink.frame.util.onClick
 import com.adealink.weparty.commonui.ext.isViewValid
@@ -13,6 +13,7 @@ import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinde
 import com.adealink.weparty.module.order.data.OrderDiscountInfo
 import com.adealink.weparty.module.order.data.getFinalPrice
 import com.adealink.weparty.module.order.data.observeDiscount
+import com.adealink.weparty.module.order.data.unObserveDiscount
 import com.adealink.weparty.module.profile.data.UserPlaymateSkill
 import com.adealink.weparty.order.R
 import com.adealink.weparty.order.databinding.LayoutCreateOrderCategoryItemBinding
@@ -25,6 +26,7 @@ data class CategoryListItemData(
 )
 
 class CategoryItemViewBinder(
+    val owner: LifecycleOwner,
     val listener: CategoryChooseListener
 ) :
     ItemViewBinder<CategoryListItemData, CategoryItemViewBinder.ViewHolder>() {
@@ -51,6 +53,16 @@ class CategoryItemViewBinder(
         }
     }
 
+    override fun onViewAttachedToWindow(holder: ViewHolder) {
+        super.onViewAttachedToWindow(holder)
+        observeDiscount(owner, holder.discountObserver)
+    }
+
+    override fun onViewDetachedFromWindow(holder: ViewHolder) {
+        super.onViewDetachedFromWindow(holder)
+        unObserveDiscount(holder.discountObserver)
+    }
+
     inner class ViewHolder(
         binding: LayoutCreateOrderCategoryItemBinding,
     ) : BindingViewHolder<LayoutCreateOrderCategoryItemBinding>(binding) {
@@ -75,13 +87,10 @@ class CategoryItemViewBinder(
             binding.tvTitle.text = item.data.name
             binding.vPrice.setPrice(item.data.price, item.data.unit)
 
-            binding.root.findViewTreeLifecycleOwner()?.let {
-                observeDiscount(it, discountObserver)
-            }
             updatePrice()
         }
 
-        private val discountObserver = object : Observer<OrderDiscountInfo?> {
+        val discountObserver = object : Observer<OrderDiscountInfo?> {
 
             override fun onChanged(value: OrderDiscountInfo?) {
                 updatePrice()

+ 1 - 0
module/playmate/src/main/java/com/adealink/weparty/playmate/detail/comp/PlaymateDetailBottomComp.kt

@@ -108,6 +108,7 @@ class PlaymateDetailBottomComp(
             binding.vOther.vPrice.show()
             binding.vOther.vPrice.setPrice(finalPrice.discountPrice, data.unit)
         } else {
+            binding.vOther.vPriceDiscount.gone()
             binding.vOther.vPrice.show()
             binding.vOther.vPrice.setPrice(data.price, data.unit)
         }

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

@@ -120,7 +120,7 @@ class GuestPlaymateListFragment : BaseFragment(R.layout.fragment_playmate_list),
             }
         })
 
-        listAdapter.register(PlaymateListItemViewBinder(this))
+        listAdapter.register(PlaymateListItemViewBinder(this, this))
         binding.vList.adapter = listAdapter
         binding.vList.layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
         binding.vList.addItemDecoration(VerticalSpaceItemDecoration(10.dp()))

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

@@ -163,7 +163,7 @@ class PlaymateListFragment : BaseFragment(R.layout.fragment_playmate_list),
             }
         })
 
-        listAdapter.register(PlaymateListItemViewBinder(this))
+        listAdapter.register(PlaymateListItemViewBinder(this, this))
         binding.vList.adapter = listAdapter
         binding.vList.layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
         binding.vList.addItemDecoration(

+ 15 - 7
module/playmate/src/main/java/com/adealink/weparty/playmate/list/adapter/PlaymateListItemViewBinder.kt

@@ -2,9 +2,10 @@ package com.adealink.weparty.playmate.list.adapter
 
 import android.view.LayoutInflater
 import android.view.ViewGroup
+import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.Observer
-import androidx.lifecycle.findViewTreeLifecycleOwner
 import com.adealink.frame.aab.util.getCompatString
+import com.adealink.frame.log.Log
 import com.adealink.frame.util.onClick
 import com.adealink.weparty.commonui.ext.gone
 import com.adealink.weparty.commonui.ext.hide
@@ -15,6 +16,7 @@ import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinde
 import com.adealink.weparty.module.order.data.OrderDiscountInfo
 import com.adealink.weparty.module.order.data.getFinalPrice
 import com.adealink.weparty.module.order.data.observeDiscount
+import com.adealink.weparty.module.order.data.unObserveDiscount
 import com.adealink.weparty.playmate.R
 import com.adealink.weparty.playmate.data.PlaymateListData
 import com.adealink.weparty.playmate.data.PlaymateListItemData
@@ -24,8 +26,10 @@ import com.adealink.weparty.util.formatNumber
 import com.adealink.weparty.util.formatStar
 import com.adealink.weparty.R as APP_R
 
-class PlaymateListItemViewBinder(val listener: OnPlaymateListListener) :
-    ItemViewBinder<PlaymateListItemData, PlaymateListItemViewBinder.ViewHolder>() {
+class PlaymateListItemViewBinder(
+    val lifecycleOwner: LifecycleOwner,
+    val listener: OnPlaymateListListener
+) : ItemViewBinder<PlaymateListItemData, PlaymateListItemViewBinder.ViewHolder>() {
 
 
     override fun onCreateViewHolder(
@@ -43,10 +47,16 @@ class PlaymateListItemViewBinder(val listener: OnPlaymateListListener) :
         holder.binding.vOnline.onStop()
     }
 
+    override fun onViewAttachedToWindow(holder: ViewHolder) {
+        super.onViewAttachedToWindow(holder)
+        observeDiscount(lifecycleOwner, holder.discountObserver)
+    }
+
     override fun onViewRecycled(holder: ViewHolder) {
         super.onViewRecycled(holder)
         holder.binding.vVoice.stopPlay()
         holder.binding.vOnline.onStop()
+        unObserveDiscount(holder.discountObserver)
     }
 
     override fun onBindViewHolder(
@@ -123,14 +133,12 @@ class PlaymateListItemViewBinder(val listener: OnPlaymateListListener) :
             }
 
             notifyPriceChanged()
-            binding.root.findViewTreeLifecycleOwner()?.let {
-                observeDiscount(it, discountObserver)
-            }
         }
 
-        private val discountObserver = object : Observer<OrderDiscountInfo?> {
+        val discountObserver = object : Observer<OrderDiscountInfo?> {
 
             override fun onChanged(value: OrderDiscountInfo?) {
+                Log.d("zhangfei", "position:${layoutPosition}, discountObserver:$this")
                 notifyPriceChanged()
             }
         }