Browse Source

提交人:jtm
提交内容:菜品刷新优化

江天明 1 year ago
parent
commit
7bad8aa077

+ 57 - 0
BusinessCommon/src/main/java/com/develop/common/utils/compat/ShapeableImageViewCompat.java

@@ -0,0 +1,57 @@
+package com.develop.common.utils.compat;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.google.android.material.imageview.ShapeableImageView;
+import com.scwang.smart.refresh.footer.ClassicsFooter;
+
+import org.alee.component.skin.factory2.IExpandedFactory2;
+import org.alee.component.skin.service.ThemeSkinService;
+
+/**
+ * 摘要
+ *
+ * <p> 详细描述
+ *
+ * @author MingYu.Liu
+ * created in 2022/9/26
+ */
+public class ShapeableImageViewCompat {
+
+    public static void init() {
+        ThemeSkinService.getInstance().getCreateViewInterceptor().add(new ShapeableImageViewFactory());
+    }
+
+
+    private static class ShapeableImageViewFactory implements IExpandedFactory2 {
+
+        /**
+         * {@link RecyclerView} 类名
+         */
+        private final static String CLASS_NAME = ShapeableImageView.class.getName();
+
+        /**
+         * 创建View
+         *
+         * @param originalView 上一个IExpandedFactory生成的View
+         * @param parent       父View
+         * @param name         名称
+         * @param context      {@link Context}
+         * @param attrs        {@link AttributeSet}
+         *
+         * @return 生成的View
+         */
+        @NonNull
+        @Override
+        public View onCreateView(@Nullable View originalView, @Nullable View parent, @NonNull String name, @NonNull Context context, @NonNull AttributeSet attrs) {
+            return TextUtils.equals(CLASS_NAME, name) ? new ShapeableImageView(context, attrs) : originalView;
+        }
+    }
+}

+ 36 - 25
BusinessCommon/src/main/java/com/develop/common/widget/FoodContentView.kt

@@ -6,6 +6,7 @@ import android.util.AttributeSet
 import android.util.Log
 import android.view.View
 import android.widget.RelativeLayout
+import androidx.constraintlayout.widget.ConstraintLayout
 import com.blankj.utilcode.util.ThreadUtils.runOnUiThread
 import com.bumptech.glide.Glide
 import com.bumptech.glide.load.DataSource
@@ -13,6 +14,7 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy
 import com.bumptech.glide.load.engine.GlideException
 import com.bumptech.glide.request.RequestListener
 import com.bumptech.glide.request.target.Target
+import com.develop.base.ext.background_drawable
 import com.develop.base.ext.load
 import com.develop.base.ext.navigateTo
 import com.develop.base.ext.resId2Dimension
@@ -35,10 +37,10 @@ import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 import org.greenrobot.eventbus.EventBus
 
-class FoodContentView : RelativeLayout {
-    constructor(context: Context?) : super(context) {}
-    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {}
-    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
+class FoodContentView : ConstraintLayout {
+    constructor(context: Context) : super(context) {}
+    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {}
+    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
         context, attrs, defStyleAttr
     ) {
     }
@@ -57,6 +59,8 @@ class FoodContentView : RelativeLayout {
     init {
         val root = View.inflate(context, R.layout.food_content_view, this)
         binding = FoodContentViewBinding.bind(root)
+//        binding.contentLayout.background_drawable = R.drawable.food_content_conner
+//        binding.likeLayout.background_drawable = R.drawable.white_circle
         binding.contentLayout.setOnClickListener {
             mFoodContent?.apply {
                 TopResumedAtyHolder.getCurrentActivity()?.navigateTo(Screens.Cook.COOK_DETAIL) {
@@ -176,30 +180,30 @@ class FoodContentView : RelativeLayout {
             if ("" != cover) ivCover.load(cover, binding.ivCover.width, binding.ivCover.height)
             tvFoodName.updateText(content.foodName)
             Log.d("------", "---666---")
-            starView.apply {
-                setCommentNumber(content.useNum.toString())
-                setCommentTextColorGray()
-            }
-            Log.d("------", "---777---")
-            tvTimeAndLevel.updateText("${content.time}・${content.level}")
-            if (isNetRecipes) {
-                ivNet.visibility = View.VISIBLE
-            } else {
-                ivNet.visibility = View.GONE
-            }
-            if (hasDownload) {
-                ivLike.src = R.drawable.ic_delete
-            } else {
-                if (isLike) {
-                    ivLike.src = R.drawable.ic_like
-                } else {
-                    ivLike.src = R.drawable.ic_unlike
-                }
-            }
+//            starView.apply {
+//                setCommentNumber(content.useNum.toString())
+//                setCommentTextColorGray()
+//            }
+//            Log.d("------", "---777---")
+//            tvTimeAndLevel.updateText("${content.time}・${content.level}")
+//            if (isNetRecipes) {
+//                ivNet.visibility = View.VISIBLE
+//            } else {
+//                ivNet.visibility = View.GONE
+//            }
+//            if (hasDownload) {
+//                ivLike.src = R.drawable.ic_delete
+//            } else {
+//                if (isLike) {
+//                    ivLike.src = R.drawable.ic_like
+//                } else {
+//                    ivLike.src = R.drawable.ic_unlike
+//                }
+//            }
 
         }
 
-        com.develop.base.scop.safeGlobalScope.launch(Dispatchers.IO){
+        com.develop.base.scop.safeGlobalScope.launch(Dispatchers.IO) {
             val result = FoodDataProvider.getUserDatabase().userInfoDao()
                 .queryUserTag(CURRENT_USER_ID, content.foodId)
             withMain {
@@ -213,6 +217,13 @@ class FoodContentView : RelativeLayout {
         Log.d("------", "---999---")
     }
 
+
+    fun recycleImageView() {
+        binding.ivCover.apply {
+            Glide.with(context).clear(this)
+        }
+    }
+
     companion object {
         val dp10 = (com.develop.common.R.dimen.convert_10px).resId2Dimension()
     }

+ 21 - 21
BusinessCommon/src/main/java/com/develop/common/widget/StarView.kt

@@ -33,36 +33,36 @@ class StarView : LinearLayout {
         if (starCount > 5 || starCount < 0) {
             starCount = 0
         }
-        binding.star1.load(R.drawable.ic_star_unselected)
-        binding.star2.load(R.drawable.ic_star_unselected)
-        binding.star3.load(R.drawable.ic_star_unselected)
-        binding.star4.load(R.drawable.ic_star_unselected)
-        binding.star5.load(R.drawable.ic_star_unselected)
+        binding.star1.isSelected = false
+        binding.star2.isSelected = false
+        binding.star3.isSelected = false
+        binding.star4.isSelected = false
+        binding.star5.isSelected = false
         when (starCount) {
             1 -> {
-                binding.star1.load(R.drawable.ic_star_selected)
+                binding.star1.isSelected = true
             }
             2 -> {
-                binding.star1.load(R.drawable.ic_star_selected)
-                binding.star2.load(R.drawable.ic_star_selected)
+                binding.star1.isSelected = true
+                binding.star2.isSelected = true
             }
             3 -> {
-                binding.star1.load(R.drawable.ic_star_selected)
-                binding.star2.load(R.drawable.ic_star_selected)
-                binding.star3.load(R.drawable.ic_star_selected)
+                binding.star1.isSelected = true
+                binding.star2.isSelected = true
+                binding.star3.isSelected = true
             }
             4 -> {
-                binding.star1.load(R.drawable.ic_star_selected)
-                binding.star2.load(R.drawable.ic_star_selected)
-                binding.star3.load(R.drawable.ic_star_selected)
-                binding.star4.load(R.drawable.ic_star_selected)
+                binding.star1.isSelected = true
+                binding.star2.isSelected = true
+                binding.star3.isSelected = true
+                binding.star4.isSelected = true
             }
             5 -> {
-                binding.star1.load(R.drawable.ic_star_selected)
-                binding.star2.load(R.drawable.ic_star_selected)
-                binding.star3.load(R.drawable.ic_star_selected)
-                binding.star4.load(R.drawable.ic_star_selected)
-                binding.star5.load(R.drawable.ic_star_selected)
+                binding.star1.isSelected = true
+                binding.star2.isSelected = true
+                binding.star3.isSelected = true
+                binding.star4.isSelected = true
+                binding.star5.isSelected = true
             }
         }
 
@@ -73,6 +73,6 @@ class StarView : LinearLayout {
     }
 
     fun setCommentTextColorGray() {
-        binding.tvNumber.text_color = resources.getColor(R.color.color_A3A3A2)
+        binding.tvNumber.setTextColor(resources.getColor(R.color.color_A3A3A2))
     }
 }

+ 5 - 0
BusinessCommon/src/main/res/drawable/ic_star_selector.xml

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

+ 64 - 57
BusinessCommon/src/main/res/layout/food_content_view.xml

@@ -1,9 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tool="http://schemas.android.com/tools"
     android:id="@+id/content_layout"
-    android:background="@drawable/food_content_conner"
     android:layout_width="match_parent"
     android:layout_height="@dimen/convert_330px">
 
@@ -12,72 +11,80 @@
         android:layout_width="match_parent"
         android:layout_height="@dimen/convert_180px"
         android:scaleType="centerCrop"
+        app:layout_constraintTop_toTopOf="parent"
         app:shapeAppearanceOverlay="@style/topRightCornerStyle" />
 
     <RelativeLayout
         android:id="@+id/like_layout"
         android:layout_width="@dimen/convert_40px"
         android:layout_height="@dimen/convert_40px"
-        android:layout_alignParentEnd="true"
         android:layout_marginTop="@dimen/convert_13px"
         android:layout_marginEnd="@dimen/convert_15px"
-        android:background="@drawable/white_circle">
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent"/>
 
-        <ImageView
-            android:id="@+id/iv_like"
-            android:layout_width="@dimen/convert_25px"
-            android:layout_height="@dimen/convert_23px"
-            android:layout_centerInParent="true" />
-    </RelativeLayout>
+    <ImageView
+        android:id="@+id/iv_like"
+        android:layout_width="@dimen/convert_25px"
+        android:layout_height="@dimen/convert_23px"
+        android:layout_centerInParent="true"
+        android:layout_marginTop="@dimen/convert_22px"
+        android:layout_marginEnd="@dimen/convert_23px"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
 
-    <RelativeLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_below="@id/iv_cover"
-        android:layout_alignParentBottom="true"
-        android:paddingStart="@dimen/convert_22px">
 
+    <ImageView
+        android:id="@+id/iv_net"
+        android:layout_width="@dimen/convert_24px"
+        android:layout_height="@dimen/convert_24px"
+        android:layout_marginStart="@dimen/convert_22px"
+        android:layout_marginTop="@dimen/convert_18px"
+        android:layout_marginEnd="@dimen/convert_8px"
+        android:layout_marginBottom="@dimen/convert_15px"
+        android:background="@drawable/ic_gray_net"
+        android:visibility="gone"
+        app:layout_constraintBottom_toTopOf="@id/tv_time_and_level"
+        app:layout_constraintStart_toStartOf="parent" />
 
-        <ImageView
-            android:id="@+id/iv_net"
-            android:layout_width="@dimen/convert_24px"
-            android:layout_height="@dimen/convert_24px"
-            android:layout_marginTop="@dimen/convert_18px"
-            android:layout_marginEnd="@dimen/convert_8px"
-            android:background="@drawable/ic_gray_net"
-            android:visibility="gone" />
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_food_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/convert_22px"
+        android:layout_marginTop="@dimen/convert_10px"
+        android:layout_marginEnd="@dimen/convert_10px"
+        android:layout_marginBottom="@dimen/convert_10px"
+        android:ellipsize="end"
+        android:includeFontPadding="false"
+        android:singleLine="true"
+        android:textColor="@color/food_name"
+        android:textSize="@dimen/convert_30px"
+        app:layout_constraintBottom_toTopOf="@+id/tv_time_and_level"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/iv_net"
+        tool:text="Guacamole" />
 
-        <androidx.appcompat.widget.AppCompatTextView
-            android:id="@+id/tv_food_name"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="@dimen/convert_10px"
-            android:layout_marginEnd="@dimen/convert_10px"
-            android:layout_toEndOf="@id/iv_net"
-            android:ellipsize="end"
-            android:includeFontPadding="false"
-            android:singleLine="true"
-            android:textColor="@color/food_name"
-            android:textSize="@dimen/convert_30px"
-            tool:text="Guacamole" />
-
-        <androidx.appcompat.widget.AppCompatTextView
-            android:id="@+id/tv_time_and_level"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_below="@id/tv_food_name"
-            android:layout_marginEnd="@dimen/convert_10px"
-            android:ellipsize="end"
-            android:singleLine="true"
-            android:textColor="@color/color_A3A3A2"
-            android:textSize="@dimen/convert_26px"
-            tool:text="5min・Easy" />
+    <androidx.appcompat.widget.AppCompatTextView
+        android:id="@+id/tv_time_and_level"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/convert_22px"
+        android:layout_marginEnd="@dimen/convert_10px"
+        android:layout_marginBottom="@dimen/convert_15px"
+        android:ellipsize="end"
+        android:singleLine="true"
+        android:textColor="@color/color_A3A3A2"
+        android:textSize="@dimen/convert_26px"
+        app:layout_constraintBottom_toTopOf="@+id/star_view"
+        tool:text="5min・Easy" />
 
-        <com.develop.common.widget.StarView
-            android:id="@+id/star_view"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_alignParentBottom="true"
-            android:layout_marginBottom="@dimen/convert_28px" />
-    </RelativeLayout>
-</RelativeLayout>
+    <com.develop.common.widget.StarView
+        android:id="@+id/star_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/convert_22px"
+        android:layout_marginBottom="@dimen/convert_28px"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 5 - 5
BusinessCommon/src/main/res/layout/star_view.xml

@@ -9,35 +9,35 @@
         android:id="@+id/star1"
         android:layout_width="@dimen/convert_20px"
         android:layout_height="@dimen/convert_20px"
-        android:background="@drawable/ic_star_unselected" />
+        android:background="@drawable/ic_star_selector" />
 
     <ImageView
         android:id="@+id/star2"
         android:layout_width="@dimen/convert_20px"
         android:layout_height="@dimen/convert_20px"
         android:layout_marginStart="@dimen/convert_6px"
-        android:background="@drawable/ic_star_unselected" />
+        android:background="@drawable/ic_star_selector" />
 
     <ImageView
         android:id="@+id/star3"
         android:layout_width="@dimen/convert_20px"
         android:layout_height="@dimen/convert_20px"
         android:layout_marginStart="@dimen/convert_6px"
-        android:background="@drawable/ic_star_unselected" />
+        android:background="@drawable/ic_star_selector" />
 
     <ImageView
         android:id="@+id/star4"
         android:layout_width="@dimen/convert_20px"
         android:layout_height="@dimen/convert_20px"
         android:layout_marginStart="@dimen/convert_6px"
-        android:background="@drawable/ic_star_unselected" />
+        android:background="@drawable/ic_star_selector" />
 
     <ImageView
         android:id="@+id/star5"
         android:layout_width="@dimen/convert_20px"
         android:layout_height="@dimen/convert_20px"
         android:layout_marginStart="@dimen/convert_6px"
-        android:background="@drawable/ic_star_unselected" />
+        android:background="@drawable/ic_star_selector" />
 
     <androidx.appcompat.widget.AppCompatTextView
         android:id="@+id/tv_number"

+ 7 - 2
BusinessMain/src/main/java/com/develop/main/ui/RecipesFragment.kt

@@ -12,6 +12,7 @@ import androidx.appcompat.widget.AppCompatTextView
 import androidx.cardview.widget.CardView
 import androidx.databinding.ViewDataBinding
 import androidx.recyclerview.widget.RecyclerView
+import androidx.recyclerview.widget.RecyclerView.RecyclerListener
 import androidx.recyclerview.widget.SimpleItemAnimator
 import com.bumptech.glide.Glide
 import com.develop.base.ext.background_color
@@ -200,6 +201,10 @@ class RecipesFragment : CommonBVMFragment<FragmentCommeListBinding, HomeViewMode
 
 
                             }?.models = models.foodList
+                            foodRecycle?.setRecyclerListener { holder ->
+                                holder.itemView.findViewById<FoodContentView>(com.develop.common.R.id.food_content_view)
+                                    .recycleImageView()
+                            }
                         }
 
                         HOME_FUNCTION_PROVIDER -> {
@@ -482,13 +487,13 @@ class RecipesFragment : CommonBVMFragment<FragmentCommeListBinding, HomeViewMode
 
             moreLocalRecipeLiveData.observe(viewLifecycleOwner) {
                 Log.d("------", "---222---")
-                binding.page.finishLoadMore(0)
                 foodRecycle?.bindingAdapter?.addModels(it, true)
+                binding.page.finishLoadMore(0)
             }
 
             moreSearchLocalRecipeLiveData.observe(viewLifecycleOwner) {
-                binding.page.finishLoadMore(0)
                 foodRecycle?.bindingAdapter?.addModels(it, true)
+                binding.page.finishLoadMore(0)
             }
 
             //获取线上分类回调

+ 2 - 1
app/src/main/java/com/develop/foodcooking/FoodCookingApp.kt

@@ -22,6 +22,7 @@ import com.develop.common.utils.compat.CategoryTabViewLayoutCompat
 import com.develop.common.utils.compat.ClassicsFooterCompat
 import com.develop.common.utils.compat.FoodContentViewCompat
 import com.develop.common.utils.compat.RecyclerViewCompat
+import com.develop.common.utils.compat.ShapeableImageViewCompat
 import com.develop.common.utils.compat.SmartRefreshLayoutCompat
 import com.develop.common.utils.compat.StartViewCompat
 import com.drake.net.convert.NetConverter
@@ -48,7 +49,7 @@ class FoodCookingApp : BaseApp() {
             ConstraintLayoutCompat.init()
             RecyclerViewCompat.init()
             SmartRefreshLayoutCompat.init()
-            CategoryTabViewLayoutCompat.init()
+            ShapeableImageViewCompat.init()
             StartViewCompat.init()
         }
     }

+ 9 - 2
libBase/src/main/java/com/develop/base/ext/GlobaExt.kt

@@ -21,6 +21,8 @@ import com.bumptech.glide.Glide
 import com.bumptech.glide.load.engine.DiskCacheStrategy
 import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
 import com.bumptech.glide.request.target.BitmapImageViewTarget
+import com.bumptech.glide.request.target.SimpleTarget
+import com.bumptech.glide.request.transition.Transition
 import com.develop.base.app.BaseApp
 import com.develop.base.util.MMkvUtils
 import kotlinx.serialization.decodeFromString
@@ -223,10 +225,15 @@ fun ImageView.load(data: Any?, width: Int, height: Int) {
     Glide.with(this.context)
         .asDrawable()
         .load(data)
-        .diskCacheStrategy(DiskCacheStrategy.ALL)
+        .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
         .skipMemoryCache(true)
         .override(width, height)
-        .into(this)
+        .dontAnimate()
+        .into(object:SimpleTarget<Drawable>(){
+            override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {
+                this@load.setImageDrawable(resource)
+            }
+        })
 }
 
 fun ImageView.load(data: Any?, error: Int) {