diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt new file mode 100644 index 0000000..88c3ad6 --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -0,0 +1,49 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.br.R +import com.casic.br.model.FeaturedGoodsModel + +/** + * 精选好物,九宫格Adapter + * */ +class FeaturedGoodsAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_featured_goods_rv_g, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.deviceNameView.text = dataRows[position].deviceName + holder.descriptionView.text = dataRows[position].deviceDesc + holder.itemView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnGridItemClickListener? = null + + interface OnGridItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnGridItemClickListener(clickListener: OnGridItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val descriptionView: TextView = itemView.findViewById(R.id.descriptionView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt new file mode 100644 index 0000000..88c3ad6 --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -0,0 +1,49 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.br.R +import com.casic.br.model.FeaturedGoodsModel + +/** + * 精选好物,九宫格Adapter + * */ +class FeaturedGoodsAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_featured_goods_rv_g, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.deviceNameView.text = dataRows[position].deviceName + holder.descriptionView.text = dataRows[position].deviceDesc + holder.itemView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnGridItemClickListener? = null + + interface OnGridItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnGridItemClickListener(clickListener: OnGridItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val descriptionView: TextView = itemView.findViewById(R.id.descriptionView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt b/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt new file mode 100644 index 0000000..84e3596 --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt @@ -0,0 +1,50 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.br.R +import com.casic.br.model.FeaturedGoodsModel +import com.casic.br.model.RecommendModel + +/** + * 猜你喜欢,九宫格Adapter + * */ +class RecommendAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_recommend_rv_g, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.deviceNameView.text = dataRows[position].deviceName + holder.descriptionView.text = dataRows[position].deviceDesc + holder.itemView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnGridItemClickListener? = null + + interface OnGridItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnGridItemClickListener(clickListener: OnGridItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val descriptionView: TextView = itemView.findViewById(R.id.descriptionView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt new file mode 100644 index 0000000..88c3ad6 --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -0,0 +1,49 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.br.R +import com.casic.br.model.FeaturedGoodsModel + +/** + * 精选好物,九宫格Adapter + * */ +class FeaturedGoodsAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_featured_goods_rv_g, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.deviceNameView.text = dataRows[position].deviceName + holder.descriptionView.text = dataRows[position].deviceDesc + holder.itemView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnGridItemClickListener? = null + + interface OnGridItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnGridItemClickListener(clickListener: OnGridItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val descriptionView: TextView = itemView.findViewById(R.id.descriptionView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt b/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt new file mode 100644 index 0000000..84e3596 --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt @@ -0,0 +1,50 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.br.R +import com.casic.br.model.FeaturedGoodsModel +import com.casic.br.model.RecommendModel + +/** + * 猜你喜欢,九宫格Adapter + * */ +class RecommendAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_recommend_rv_g, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.deviceNameView.text = dataRows[position].deviceName + holder.descriptionView.text = dataRows[position].deviceDesc + holder.itemView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnGridItemClickListener? = null + + interface OnGridItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnGridItemClickListener(clickListener: OnGridItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val descriptionView: TextView = itemView.findViewById(R.id.descriptionView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt index 6cf36e6..68791a0 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt @@ -2,7 +2,12 @@ import com.bumptech.glide.Glide import com.casic.br.R +import com.casic.br.adapter.FeaturedGoodsAdapter +import com.casic.br.adapter.RecommendAdapter import com.casic.br.model.BannerImageModel +import com.casic.br.model.FeaturedGoodsModel +import com.casic.br.model.RecommendModel +import com.casic.br.utils.GridItemDecoration import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.youth.banner.Banner @@ -24,7 +29,7 @@ override fun initData() { //TODO 模拟数据 val imageModels = ArrayList() - for (i in 0..5) { + for (i in 0..4) { val model = BannerImageModel() model.imageTitle = "测试轮播图" model.imageLink = "https://img95.699pic.com/photo/40006/1412.jpg_wh860.jpg" @@ -54,6 +59,44 @@ "${imageModel.imageTitle}被点击了".show(requireContext()) } } + + //TODO 模拟数据 + val goodsModels = ArrayList() + for (i in 0..5) { + val model = FeaturedGoodsModel() + model.deviceName = "******热水器" + model.deviceDesc = "描述文字" + + goodsModels.add(model) + } + val featuredGoodsAdapter = FeaturedGoodsAdapter(requireContext(), goodsModels) + goodsRecyclerView.addItemDecoration(GridItemDecoration(requireContext())) + goodsRecyclerView.adapter = featuredGoodsAdapter + featuredGoodsAdapter.setOnGridItemClickListener(object : + FeaturedGoodsAdapter.OnGridItemClickListener { + override fun onItemClick(position: Int) { + + } + }) + + //TODO 模拟数据 + val recommendModels = ArrayList() + for (i in 0..5) { + val model = RecommendModel() + model.deviceName = "智能厨房*****" + model.deviceDesc = "描述文字" + + recommendModels.add(model) + } + val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) + recommendGridView.addItemDecoration(GridItemDecoration(requireContext())) + recommendGridView.adapter = recommendAdapter + recommendAdapter.setOnGridItemClickListener(object : + RecommendAdapter.OnGridItemClickListener { + override fun onItemClick(position: Int) { + + } + }) } override fun initEvent() { diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt new file mode 100644 index 0000000..88c3ad6 --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -0,0 +1,49 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.br.R +import com.casic.br.model.FeaturedGoodsModel + +/** + * 精选好物,九宫格Adapter + * */ +class FeaturedGoodsAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_featured_goods_rv_g, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.deviceNameView.text = dataRows[position].deviceName + holder.descriptionView.text = dataRows[position].deviceDesc + holder.itemView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnGridItemClickListener? = null + + interface OnGridItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnGridItemClickListener(clickListener: OnGridItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val descriptionView: TextView = itemView.findViewById(R.id.descriptionView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt b/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt new file mode 100644 index 0000000..84e3596 --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt @@ -0,0 +1,50 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.br.R +import com.casic.br.model.FeaturedGoodsModel +import com.casic.br.model.RecommendModel + +/** + * 猜你喜欢,九宫格Adapter + * */ +class RecommendAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_recommend_rv_g, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.deviceNameView.text = dataRows[position].deviceName + holder.descriptionView.text = dataRows[position].deviceDesc + holder.itemView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnGridItemClickListener? = null + + interface OnGridItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnGridItemClickListener(clickListener: OnGridItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val descriptionView: TextView = itemView.findViewById(R.id.descriptionView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt index 6cf36e6..68791a0 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt @@ -2,7 +2,12 @@ import com.bumptech.glide.Glide import com.casic.br.R +import com.casic.br.adapter.FeaturedGoodsAdapter +import com.casic.br.adapter.RecommendAdapter import com.casic.br.model.BannerImageModel +import com.casic.br.model.FeaturedGoodsModel +import com.casic.br.model.RecommendModel +import com.casic.br.utils.GridItemDecoration import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.youth.banner.Banner @@ -24,7 +29,7 @@ override fun initData() { //TODO 模拟数据 val imageModels = ArrayList() - for (i in 0..5) { + for (i in 0..4) { val model = BannerImageModel() model.imageTitle = "测试轮播图" model.imageLink = "https://img95.699pic.com/photo/40006/1412.jpg_wh860.jpg" @@ -54,6 +59,44 @@ "${imageModel.imageTitle}被点击了".show(requireContext()) } } + + //TODO 模拟数据 + val goodsModels = ArrayList() + for (i in 0..5) { + val model = FeaturedGoodsModel() + model.deviceName = "******热水器" + model.deviceDesc = "描述文字" + + goodsModels.add(model) + } + val featuredGoodsAdapter = FeaturedGoodsAdapter(requireContext(), goodsModels) + goodsRecyclerView.addItemDecoration(GridItemDecoration(requireContext())) + goodsRecyclerView.adapter = featuredGoodsAdapter + featuredGoodsAdapter.setOnGridItemClickListener(object : + FeaturedGoodsAdapter.OnGridItemClickListener { + override fun onItemClick(position: Int) { + + } + }) + + //TODO 模拟数据 + val recommendModels = ArrayList() + for (i in 0..5) { + val model = RecommendModel() + model.deviceName = "智能厨房*****" + model.deviceDesc = "描述文字" + + recommendModels.add(model) + } + val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) + recommendGridView.addItemDecoration(GridItemDecoration(requireContext())) + recommendGridView.adapter = recommendAdapter + recommendAdapter.setOnGridItemClickListener(object : + RecommendAdapter.OnGridItemClickListener { + override fun onItemClick(position: Int) { + + } + }) } override fun initEvent() { diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java new file mode 100644 index 0000000..81d2e03 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -0,0 +1,34 @@ +package com.casic.br.model; + +/** + * 精选好物数据模型 + */ +public class FeaturedGoodsModel { + private String deviceName; + private String deviceImage; + private String deviceDesc; + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceImage() { + return deviceImage; + } + + public void setDeviceImage(String deviceImage) { + this.deviceImage = deviceImage; + } + + public String getDeviceDesc() { + return deviceDesc; + } + + public void setDeviceDesc(String deviceDesc) { + this.deviceDesc = deviceDesc; + } +} diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt new file mode 100644 index 0000000..88c3ad6 --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -0,0 +1,49 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.br.R +import com.casic.br.model.FeaturedGoodsModel + +/** + * 精选好物,九宫格Adapter + * */ +class FeaturedGoodsAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_featured_goods_rv_g, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.deviceNameView.text = dataRows[position].deviceName + holder.descriptionView.text = dataRows[position].deviceDesc + holder.itemView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnGridItemClickListener? = null + + interface OnGridItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnGridItemClickListener(clickListener: OnGridItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val descriptionView: TextView = itemView.findViewById(R.id.descriptionView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt b/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt new file mode 100644 index 0000000..84e3596 --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt @@ -0,0 +1,50 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.br.R +import com.casic.br.model.FeaturedGoodsModel +import com.casic.br.model.RecommendModel + +/** + * 猜你喜欢,九宫格Adapter + * */ +class RecommendAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_recommend_rv_g, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.deviceNameView.text = dataRows[position].deviceName + holder.descriptionView.text = dataRows[position].deviceDesc + holder.itemView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnGridItemClickListener? = null + + interface OnGridItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnGridItemClickListener(clickListener: OnGridItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val descriptionView: TextView = itemView.findViewById(R.id.descriptionView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt index 6cf36e6..68791a0 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt @@ -2,7 +2,12 @@ import com.bumptech.glide.Glide import com.casic.br.R +import com.casic.br.adapter.FeaturedGoodsAdapter +import com.casic.br.adapter.RecommendAdapter import com.casic.br.model.BannerImageModel +import com.casic.br.model.FeaturedGoodsModel +import com.casic.br.model.RecommendModel +import com.casic.br.utils.GridItemDecoration import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.youth.banner.Banner @@ -24,7 +29,7 @@ override fun initData() { //TODO 模拟数据 val imageModels = ArrayList() - for (i in 0..5) { + for (i in 0..4) { val model = BannerImageModel() model.imageTitle = "测试轮播图" model.imageLink = "https://img95.699pic.com/photo/40006/1412.jpg_wh860.jpg" @@ -54,6 +59,44 @@ "${imageModel.imageTitle}被点击了".show(requireContext()) } } + + //TODO 模拟数据 + val goodsModels = ArrayList() + for (i in 0..5) { + val model = FeaturedGoodsModel() + model.deviceName = "******热水器" + model.deviceDesc = "描述文字" + + goodsModels.add(model) + } + val featuredGoodsAdapter = FeaturedGoodsAdapter(requireContext(), goodsModels) + goodsRecyclerView.addItemDecoration(GridItemDecoration(requireContext())) + goodsRecyclerView.adapter = featuredGoodsAdapter + featuredGoodsAdapter.setOnGridItemClickListener(object : + FeaturedGoodsAdapter.OnGridItemClickListener { + override fun onItemClick(position: Int) { + + } + }) + + //TODO 模拟数据 + val recommendModels = ArrayList() + for (i in 0..5) { + val model = RecommendModel() + model.deviceName = "智能厨房*****" + model.deviceDesc = "描述文字" + + recommendModels.add(model) + } + val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) + recommendGridView.addItemDecoration(GridItemDecoration(requireContext())) + recommendGridView.adapter = recommendAdapter + recommendAdapter.setOnGridItemClickListener(object : + RecommendAdapter.OnGridItemClickListener { + override fun onItemClick(position: Int) { + + } + }) } override fun initEvent() { diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java new file mode 100644 index 0000000..81d2e03 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -0,0 +1,34 @@ +package com.casic.br.model; + +/** + * 精选好物数据模型 + */ +public class FeaturedGoodsModel { + private String deviceName; + private String deviceImage; + private String deviceDesc; + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceImage() { + return deviceImage; + } + + public void setDeviceImage(String deviceImage) { + this.deviceImage = deviceImage; + } + + public String getDeviceDesc() { + return deviceDesc; + } + + public void setDeviceDesc(String deviceDesc) { + this.deviceDesc = deviceDesc; + } +} diff --git a/app/src/main/java/com/casic/br/model/RecommendModel.java b/app/src/main/java/com/casic/br/model/RecommendModel.java new file mode 100644 index 0000000..3ef8b66 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/RecommendModel.java @@ -0,0 +1,34 @@ +package com.casic.br.model; + +/** + * 猜你喜欢数据模型 + */ +public class RecommendModel { + private String deviceName; + private String deviceImage; + private String deviceDesc; + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceImage() { + return deviceImage; + } + + public void setDeviceImage(String deviceImage) { + this.deviceImage = deviceImage; + } + + public String getDeviceDesc() { + return deviceDesc; + } + + public void setDeviceDesc(String deviceDesc) { + this.deviceDesc = deviceDesc; + } +} diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt new file mode 100644 index 0000000..88c3ad6 --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -0,0 +1,49 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.br.R +import com.casic.br.model.FeaturedGoodsModel + +/** + * 精选好物,九宫格Adapter + * */ +class FeaturedGoodsAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_featured_goods_rv_g, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.deviceNameView.text = dataRows[position].deviceName + holder.descriptionView.text = dataRows[position].deviceDesc + holder.itemView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnGridItemClickListener? = null + + interface OnGridItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnGridItemClickListener(clickListener: OnGridItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val descriptionView: TextView = itemView.findViewById(R.id.descriptionView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt b/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt new file mode 100644 index 0000000..84e3596 --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt @@ -0,0 +1,50 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.br.R +import com.casic.br.model.FeaturedGoodsModel +import com.casic.br.model.RecommendModel + +/** + * 猜你喜欢,九宫格Adapter + * */ +class RecommendAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_recommend_rv_g, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.deviceNameView.text = dataRows[position].deviceName + holder.descriptionView.text = dataRows[position].deviceDesc + holder.itemView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnGridItemClickListener? = null + + interface OnGridItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnGridItemClickListener(clickListener: OnGridItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val descriptionView: TextView = itemView.findViewById(R.id.descriptionView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt index 6cf36e6..68791a0 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt @@ -2,7 +2,12 @@ import com.bumptech.glide.Glide import com.casic.br.R +import com.casic.br.adapter.FeaturedGoodsAdapter +import com.casic.br.adapter.RecommendAdapter import com.casic.br.model.BannerImageModel +import com.casic.br.model.FeaturedGoodsModel +import com.casic.br.model.RecommendModel +import com.casic.br.utils.GridItemDecoration import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.youth.banner.Banner @@ -24,7 +29,7 @@ override fun initData() { //TODO 模拟数据 val imageModels = ArrayList() - for (i in 0..5) { + for (i in 0..4) { val model = BannerImageModel() model.imageTitle = "测试轮播图" model.imageLink = "https://img95.699pic.com/photo/40006/1412.jpg_wh860.jpg" @@ -54,6 +59,44 @@ "${imageModel.imageTitle}被点击了".show(requireContext()) } } + + //TODO 模拟数据 + val goodsModels = ArrayList() + for (i in 0..5) { + val model = FeaturedGoodsModel() + model.deviceName = "******热水器" + model.deviceDesc = "描述文字" + + goodsModels.add(model) + } + val featuredGoodsAdapter = FeaturedGoodsAdapter(requireContext(), goodsModels) + goodsRecyclerView.addItemDecoration(GridItemDecoration(requireContext())) + goodsRecyclerView.adapter = featuredGoodsAdapter + featuredGoodsAdapter.setOnGridItemClickListener(object : + FeaturedGoodsAdapter.OnGridItemClickListener { + override fun onItemClick(position: Int) { + + } + }) + + //TODO 模拟数据 + val recommendModels = ArrayList() + for (i in 0..5) { + val model = RecommendModel() + model.deviceName = "智能厨房*****" + model.deviceDesc = "描述文字" + + recommendModels.add(model) + } + val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) + recommendGridView.addItemDecoration(GridItemDecoration(requireContext())) + recommendGridView.adapter = recommendAdapter + recommendAdapter.setOnGridItemClickListener(object : + RecommendAdapter.OnGridItemClickListener { + override fun onItemClick(position: Int) { + + } + }) } override fun initEvent() { diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java new file mode 100644 index 0000000..81d2e03 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -0,0 +1,34 @@ +package com.casic.br.model; + +/** + * 精选好物数据模型 + */ +public class FeaturedGoodsModel { + private String deviceName; + private String deviceImage; + private String deviceDesc; + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceImage() { + return deviceImage; + } + + public void setDeviceImage(String deviceImage) { + this.deviceImage = deviceImage; + } + + public String getDeviceDesc() { + return deviceDesc; + } + + public void setDeviceDesc(String deviceDesc) { + this.deviceDesc = deviceDesc; + } +} diff --git a/app/src/main/java/com/casic/br/model/RecommendModel.java b/app/src/main/java/com/casic/br/model/RecommendModel.java new file mode 100644 index 0000000..3ef8b66 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/RecommendModel.java @@ -0,0 +1,34 @@ +package com.casic.br.model; + +/** + * 猜你喜欢数据模型 + */ +public class RecommendModel { + private String deviceName; + private String deviceImage; + private String deviceDesc; + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceImage() { + return deviceImage; + } + + public void setDeviceImage(String deviceImage) { + this.deviceImage = deviceImage; + } + + public String getDeviceDesc() { + return deviceDesc; + } + + public void setDeviceDesc(String deviceDesc) { + this.deviceDesc = deviceDesc; + } +} diff --git a/app/src/main/java/com/casic/br/utils/GridItemDecoration.kt b/app/src/main/java/com/casic/br/utils/GridItemDecoration.kt new file mode 100644 index 0000000..dfc911d --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/GridItemDecoration.kt @@ -0,0 +1,143 @@ +package com.casic.br.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Rect +import android.graphics.drawable.Drawable +import android.view.View +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.StaggeredGridLayoutManager +import java.util.* + + +class GridItemDecoration(context: Context) : RecyclerView.ItemDecoration() { + private val attrs = intArrayOf(android.R.attr.listDivider) + private var dividerDrawable: Drawable? = null + + init { + val a = context.obtainStyledAttributes(attrs) + dividerDrawable = a.getDrawable(0) + a.recycle() + } + + override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) { + drawHorizontalLine(c, parent) + drawVerticalLine(c, parent) + } + + private fun drawHorizontalLine(c: Canvas, parent: RecyclerView) { + val childCount = parent.childCount + for (i in 0 until childCount) { + val child = parent.getChildAt(i) + val params = child.layoutParams as RecyclerView.LayoutParams + val left = child.left - params.leftMargin + val right = child.right + params.rightMargin + dividerDrawable!!.intrinsicWidth + val top = child.bottom + params.bottomMargin + val bottom = top + dividerDrawable!!.intrinsicHeight + dividerDrawable!!.setBounds(left, top, right, bottom) + dividerDrawable!!.draw(c) + } + } + + private fun drawVerticalLine(c: Canvas?, parent: RecyclerView) { + val childCount = parent.childCount + for (i in 0 until childCount) { + val child = parent.getChildAt(i) + val params = child.layoutParams as RecyclerView.LayoutParams + val top = child.top - params.topMargin + val bottom = child.bottom + params.bottomMargin + val left = child.right + params.rightMargin + val right = left + dividerDrawable!!.intrinsicWidth + dividerDrawable!!.setBounds(left, top, right, bottom) + dividerDrawable!!.draw(c!!) + } + } + + override fun getItemOffsets( + outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State + ) { + val spanCount = getSpanCount(parent) + val childCount = Objects.requireNonNull(parent.adapter).itemCount + val itemPosition = parent.getChildAdapterPosition(view) + if (isLastColumn(parent, itemPosition, spanCount, childCount)) { + // 如果是最后一列,则不需要绘制右边 + if (itemPosition == childCount - 1) { + outRect[0, 0, 0] = 0 + } else { + outRect[0, 0, 0] = dividerDrawable!!.intrinsicHeight + } + } else if (isLastRaw(parent, itemPosition, spanCount, childCount)) { + // 如果是最后一行,则不需要绘制底部 + outRect[0, 0, dividerDrawable!!.intrinsicWidth] = 0 + } else { + outRect[0, 0, dividerDrawable!!.intrinsicWidth] = dividerDrawable!!.intrinsicHeight + } + } + + private fun getSpanCount(parent: RecyclerView): Int { + // 列数 + var spanCount = -1 + val layoutManager = parent.layoutManager + if (layoutManager is GridLayoutManager) { + spanCount = layoutManager.spanCount + } else if (layoutManager is StaggeredGridLayoutManager) { + spanCount = layoutManager.spanCount + } + return spanCount + } + + private fun isLastColumn( + parent: RecyclerView, pos: Int, spanCount: Int, childCount: Int + ): Boolean { + var tempCount = childCount + val layoutManager = parent.layoutManager + if (layoutManager is GridLayoutManager) { + // 如果是最后一列,则不需要绘制右边 + return (pos + 1) % spanCount == 0 + } else if (layoutManager is StaggeredGridLayoutManager) { + val orientation = layoutManager.orientation + return if (orientation == StaggeredGridLayoutManager.VERTICAL) { + // 如果是最后一列,则不需要绘制右边 + (pos + 1) % spanCount == 0 + } else { + tempCount -= tempCount % spanCount + // 如果是最后一列,则不需要绘制右边 + pos >= tempCount + } + } + return false + } + + private fun isLastRaw( + parent: RecyclerView, pos: Int, spanCount: Int, childCount: Int + ): Boolean { + var tempCount = childCount + val layoutManager = parent.layoutManager + if (layoutManager is GridLayoutManager) { + var last = tempCount % spanCount + if (last == 0) { + last = spanCount + } + tempCount -= last + // 如果是最后一行,则不需要绘制底部 + return pos >= tempCount + } else if (layoutManager is StaggeredGridLayoutManager) { + val orientation = layoutManager.orientation + // StaggeredGridLayoutManager 且纵向滚动 + return if (orientation == StaggeredGridLayoutManager.VERTICAL) { + var last = tempCount % spanCount + if (last == 0) { + last = spanCount + } + tempCount -= last + // 如果是最后一行,则不需要绘制底部 + pos >= tempCount + } else { + // StaggeredGridLayoutManager 且横向滚动,如果是最后一行,则不需要绘制底部 + (pos + 1) % spanCount == 0 + } + } + return false + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt new file mode 100644 index 0000000..88c3ad6 --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -0,0 +1,49 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.br.R +import com.casic.br.model.FeaturedGoodsModel + +/** + * 精选好物,九宫格Adapter + * */ +class FeaturedGoodsAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_featured_goods_rv_g, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.deviceNameView.text = dataRows[position].deviceName + holder.descriptionView.text = dataRows[position].deviceDesc + holder.itemView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnGridItemClickListener? = null + + interface OnGridItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnGridItemClickListener(clickListener: OnGridItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val descriptionView: TextView = itemView.findViewById(R.id.descriptionView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt b/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt new file mode 100644 index 0000000..84e3596 --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt @@ -0,0 +1,50 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.br.R +import com.casic.br.model.FeaturedGoodsModel +import com.casic.br.model.RecommendModel + +/** + * 猜你喜欢,九宫格Adapter + * */ +class RecommendAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_recommend_rv_g, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.deviceNameView.text = dataRows[position].deviceName + holder.descriptionView.text = dataRows[position].deviceDesc + holder.itemView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnGridItemClickListener? = null + + interface OnGridItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnGridItemClickListener(clickListener: OnGridItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val descriptionView: TextView = itemView.findViewById(R.id.descriptionView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt index 6cf36e6..68791a0 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt @@ -2,7 +2,12 @@ import com.bumptech.glide.Glide import com.casic.br.R +import com.casic.br.adapter.FeaturedGoodsAdapter +import com.casic.br.adapter.RecommendAdapter import com.casic.br.model.BannerImageModel +import com.casic.br.model.FeaturedGoodsModel +import com.casic.br.model.RecommendModel +import com.casic.br.utils.GridItemDecoration import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.youth.banner.Banner @@ -24,7 +29,7 @@ override fun initData() { //TODO 模拟数据 val imageModels = ArrayList() - for (i in 0..5) { + for (i in 0..4) { val model = BannerImageModel() model.imageTitle = "测试轮播图" model.imageLink = "https://img95.699pic.com/photo/40006/1412.jpg_wh860.jpg" @@ -54,6 +59,44 @@ "${imageModel.imageTitle}被点击了".show(requireContext()) } } + + //TODO 模拟数据 + val goodsModels = ArrayList() + for (i in 0..5) { + val model = FeaturedGoodsModel() + model.deviceName = "******热水器" + model.deviceDesc = "描述文字" + + goodsModels.add(model) + } + val featuredGoodsAdapter = FeaturedGoodsAdapter(requireContext(), goodsModels) + goodsRecyclerView.addItemDecoration(GridItemDecoration(requireContext())) + goodsRecyclerView.adapter = featuredGoodsAdapter + featuredGoodsAdapter.setOnGridItemClickListener(object : + FeaturedGoodsAdapter.OnGridItemClickListener { + override fun onItemClick(position: Int) { + + } + }) + + //TODO 模拟数据 + val recommendModels = ArrayList() + for (i in 0..5) { + val model = RecommendModel() + model.deviceName = "智能厨房*****" + model.deviceDesc = "描述文字" + + recommendModels.add(model) + } + val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) + recommendGridView.addItemDecoration(GridItemDecoration(requireContext())) + recommendGridView.adapter = recommendAdapter + recommendAdapter.setOnGridItemClickListener(object : + RecommendAdapter.OnGridItemClickListener { + override fun onItemClick(position: Int) { + + } + }) } override fun initEvent() { diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java new file mode 100644 index 0000000..81d2e03 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -0,0 +1,34 @@ +package com.casic.br.model; + +/** + * 精选好物数据模型 + */ +public class FeaturedGoodsModel { + private String deviceName; + private String deviceImage; + private String deviceDesc; + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceImage() { + return deviceImage; + } + + public void setDeviceImage(String deviceImage) { + this.deviceImage = deviceImage; + } + + public String getDeviceDesc() { + return deviceDesc; + } + + public void setDeviceDesc(String deviceDesc) { + this.deviceDesc = deviceDesc; + } +} diff --git a/app/src/main/java/com/casic/br/model/RecommendModel.java b/app/src/main/java/com/casic/br/model/RecommendModel.java new file mode 100644 index 0000000..3ef8b66 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/RecommendModel.java @@ -0,0 +1,34 @@ +package com.casic.br.model; + +/** + * 猜你喜欢数据模型 + */ +public class RecommendModel { + private String deviceName; + private String deviceImage; + private String deviceDesc; + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceImage() { + return deviceImage; + } + + public void setDeviceImage(String deviceImage) { + this.deviceImage = deviceImage; + } + + public String getDeviceDesc() { + return deviceDesc; + } + + public void setDeviceDesc(String deviceDesc) { + this.deviceDesc = deviceDesc; + } +} diff --git a/app/src/main/java/com/casic/br/utils/GridItemDecoration.kt b/app/src/main/java/com/casic/br/utils/GridItemDecoration.kt new file mode 100644 index 0000000..dfc911d --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/GridItemDecoration.kt @@ -0,0 +1,143 @@ +package com.casic.br.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Rect +import android.graphics.drawable.Drawable +import android.view.View +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.StaggeredGridLayoutManager +import java.util.* + + +class GridItemDecoration(context: Context) : RecyclerView.ItemDecoration() { + private val attrs = intArrayOf(android.R.attr.listDivider) + private var dividerDrawable: Drawable? = null + + init { + val a = context.obtainStyledAttributes(attrs) + dividerDrawable = a.getDrawable(0) + a.recycle() + } + + override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) { + drawHorizontalLine(c, parent) + drawVerticalLine(c, parent) + } + + private fun drawHorizontalLine(c: Canvas, parent: RecyclerView) { + val childCount = parent.childCount + for (i in 0 until childCount) { + val child = parent.getChildAt(i) + val params = child.layoutParams as RecyclerView.LayoutParams + val left = child.left - params.leftMargin + val right = child.right + params.rightMargin + dividerDrawable!!.intrinsicWidth + val top = child.bottom + params.bottomMargin + val bottom = top + dividerDrawable!!.intrinsicHeight + dividerDrawable!!.setBounds(left, top, right, bottom) + dividerDrawable!!.draw(c) + } + } + + private fun drawVerticalLine(c: Canvas?, parent: RecyclerView) { + val childCount = parent.childCount + for (i in 0 until childCount) { + val child = parent.getChildAt(i) + val params = child.layoutParams as RecyclerView.LayoutParams + val top = child.top - params.topMargin + val bottom = child.bottom + params.bottomMargin + val left = child.right + params.rightMargin + val right = left + dividerDrawable!!.intrinsicWidth + dividerDrawable!!.setBounds(left, top, right, bottom) + dividerDrawable!!.draw(c!!) + } + } + + override fun getItemOffsets( + outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State + ) { + val spanCount = getSpanCount(parent) + val childCount = Objects.requireNonNull(parent.adapter).itemCount + val itemPosition = parent.getChildAdapterPosition(view) + if (isLastColumn(parent, itemPosition, spanCount, childCount)) { + // 如果是最后一列,则不需要绘制右边 + if (itemPosition == childCount - 1) { + outRect[0, 0, 0] = 0 + } else { + outRect[0, 0, 0] = dividerDrawable!!.intrinsicHeight + } + } else if (isLastRaw(parent, itemPosition, spanCount, childCount)) { + // 如果是最后一行,则不需要绘制底部 + outRect[0, 0, dividerDrawable!!.intrinsicWidth] = 0 + } else { + outRect[0, 0, dividerDrawable!!.intrinsicWidth] = dividerDrawable!!.intrinsicHeight + } + } + + private fun getSpanCount(parent: RecyclerView): Int { + // 列数 + var spanCount = -1 + val layoutManager = parent.layoutManager + if (layoutManager is GridLayoutManager) { + spanCount = layoutManager.spanCount + } else if (layoutManager is StaggeredGridLayoutManager) { + spanCount = layoutManager.spanCount + } + return spanCount + } + + private fun isLastColumn( + parent: RecyclerView, pos: Int, spanCount: Int, childCount: Int + ): Boolean { + var tempCount = childCount + val layoutManager = parent.layoutManager + if (layoutManager is GridLayoutManager) { + // 如果是最后一列,则不需要绘制右边 + return (pos + 1) % spanCount == 0 + } else if (layoutManager is StaggeredGridLayoutManager) { + val orientation = layoutManager.orientation + return if (orientation == StaggeredGridLayoutManager.VERTICAL) { + // 如果是最后一列,则不需要绘制右边 + (pos + 1) % spanCount == 0 + } else { + tempCount -= tempCount % spanCount + // 如果是最后一列,则不需要绘制右边 + pos >= tempCount + } + } + return false + } + + private fun isLastRaw( + parent: RecyclerView, pos: Int, spanCount: Int, childCount: Int + ): Boolean { + var tempCount = childCount + val layoutManager = parent.layoutManager + if (layoutManager is GridLayoutManager) { + var last = tempCount % spanCount + if (last == 0) { + last = spanCount + } + tempCount -= last + // 如果是最后一行,则不需要绘制底部 + return pos >= tempCount + } else if (layoutManager is StaggeredGridLayoutManager) { + val orientation = layoutManager.orientation + // StaggeredGridLayoutManager 且纵向滚动 + return if (orientation == StaggeredGridLayoutManager.VERTICAL) { + var last = tempCount % spanCount + if (last == 0) { + last = spanCount + } + tempCount -= last + // 如果是最后一行,则不需要绘制底部 + pos >= tempCount + } else { + // StaggeredGridLayoutManager 且横向滚动,如果是最后一行,则不需要绘制底部 + (pos + 1) % spanCount == 0 + } + } + return false + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_recommend.xml b/app/src/main/res/layout/fragment_recommend.xml index b2e55a1..f1321d8 100644 --- a/app/src/main/res/layout/fragment_recommend.xml +++ b/app/src/main/res/layout/fragment_recommend.xml @@ -7,6 +7,7 @@ @@ -36,13 +37,14 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:orientation="vertical"> - + android:scrollbars="none" + app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" + app:spanCount="2" /> - + android:scrollbars="none" + app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" + app:spanCount="2" /> \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt new file mode 100644 index 0000000..88c3ad6 --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -0,0 +1,49 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.br.R +import com.casic.br.model.FeaturedGoodsModel + +/** + * 精选好物,九宫格Adapter + * */ +class FeaturedGoodsAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_featured_goods_rv_g, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.deviceNameView.text = dataRows[position].deviceName + holder.descriptionView.text = dataRows[position].deviceDesc + holder.itemView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnGridItemClickListener? = null + + interface OnGridItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnGridItemClickListener(clickListener: OnGridItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val descriptionView: TextView = itemView.findViewById(R.id.descriptionView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt b/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt new file mode 100644 index 0000000..84e3596 --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt @@ -0,0 +1,50 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.br.R +import com.casic.br.model.FeaturedGoodsModel +import com.casic.br.model.RecommendModel + +/** + * 猜你喜欢,九宫格Adapter + * */ +class RecommendAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_recommend_rv_g, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.deviceNameView.text = dataRows[position].deviceName + holder.descriptionView.text = dataRows[position].deviceDesc + holder.itemView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnGridItemClickListener? = null + + interface OnGridItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnGridItemClickListener(clickListener: OnGridItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val descriptionView: TextView = itemView.findViewById(R.id.descriptionView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt index 6cf36e6..68791a0 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt @@ -2,7 +2,12 @@ import com.bumptech.glide.Glide import com.casic.br.R +import com.casic.br.adapter.FeaturedGoodsAdapter +import com.casic.br.adapter.RecommendAdapter import com.casic.br.model.BannerImageModel +import com.casic.br.model.FeaturedGoodsModel +import com.casic.br.model.RecommendModel +import com.casic.br.utils.GridItemDecoration import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.youth.banner.Banner @@ -24,7 +29,7 @@ override fun initData() { //TODO 模拟数据 val imageModels = ArrayList() - for (i in 0..5) { + for (i in 0..4) { val model = BannerImageModel() model.imageTitle = "测试轮播图" model.imageLink = "https://img95.699pic.com/photo/40006/1412.jpg_wh860.jpg" @@ -54,6 +59,44 @@ "${imageModel.imageTitle}被点击了".show(requireContext()) } } + + //TODO 模拟数据 + val goodsModels = ArrayList() + for (i in 0..5) { + val model = FeaturedGoodsModel() + model.deviceName = "******热水器" + model.deviceDesc = "描述文字" + + goodsModels.add(model) + } + val featuredGoodsAdapter = FeaturedGoodsAdapter(requireContext(), goodsModels) + goodsRecyclerView.addItemDecoration(GridItemDecoration(requireContext())) + goodsRecyclerView.adapter = featuredGoodsAdapter + featuredGoodsAdapter.setOnGridItemClickListener(object : + FeaturedGoodsAdapter.OnGridItemClickListener { + override fun onItemClick(position: Int) { + + } + }) + + //TODO 模拟数据 + val recommendModels = ArrayList() + for (i in 0..5) { + val model = RecommendModel() + model.deviceName = "智能厨房*****" + model.deviceDesc = "描述文字" + + recommendModels.add(model) + } + val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) + recommendGridView.addItemDecoration(GridItemDecoration(requireContext())) + recommendGridView.adapter = recommendAdapter + recommendAdapter.setOnGridItemClickListener(object : + RecommendAdapter.OnGridItemClickListener { + override fun onItemClick(position: Int) { + + } + }) } override fun initEvent() { diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java new file mode 100644 index 0000000..81d2e03 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -0,0 +1,34 @@ +package com.casic.br.model; + +/** + * 精选好物数据模型 + */ +public class FeaturedGoodsModel { + private String deviceName; + private String deviceImage; + private String deviceDesc; + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceImage() { + return deviceImage; + } + + public void setDeviceImage(String deviceImage) { + this.deviceImage = deviceImage; + } + + public String getDeviceDesc() { + return deviceDesc; + } + + public void setDeviceDesc(String deviceDesc) { + this.deviceDesc = deviceDesc; + } +} diff --git a/app/src/main/java/com/casic/br/model/RecommendModel.java b/app/src/main/java/com/casic/br/model/RecommendModel.java new file mode 100644 index 0000000..3ef8b66 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/RecommendModel.java @@ -0,0 +1,34 @@ +package com.casic.br.model; + +/** + * 猜你喜欢数据模型 + */ +public class RecommendModel { + private String deviceName; + private String deviceImage; + private String deviceDesc; + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceImage() { + return deviceImage; + } + + public void setDeviceImage(String deviceImage) { + this.deviceImage = deviceImage; + } + + public String getDeviceDesc() { + return deviceDesc; + } + + public void setDeviceDesc(String deviceDesc) { + this.deviceDesc = deviceDesc; + } +} diff --git a/app/src/main/java/com/casic/br/utils/GridItemDecoration.kt b/app/src/main/java/com/casic/br/utils/GridItemDecoration.kt new file mode 100644 index 0000000..dfc911d --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/GridItemDecoration.kt @@ -0,0 +1,143 @@ +package com.casic.br.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Rect +import android.graphics.drawable.Drawable +import android.view.View +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.StaggeredGridLayoutManager +import java.util.* + + +class GridItemDecoration(context: Context) : RecyclerView.ItemDecoration() { + private val attrs = intArrayOf(android.R.attr.listDivider) + private var dividerDrawable: Drawable? = null + + init { + val a = context.obtainStyledAttributes(attrs) + dividerDrawable = a.getDrawable(0) + a.recycle() + } + + override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) { + drawHorizontalLine(c, parent) + drawVerticalLine(c, parent) + } + + private fun drawHorizontalLine(c: Canvas, parent: RecyclerView) { + val childCount = parent.childCount + for (i in 0 until childCount) { + val child = parent.getChildAt(i) + val params = child.layoutParams as RecyclerView.LayoutParams + val left = child.left - params.leftMargin + val right = child.right + params.rightMargin + dividerDrawable!!.intrinsicWidth + val top = child.bottom + params.bottomMargin + val bottom = top + dividerDrawable!!.intrinsicHeight + dividerDrawable!!.setBounds(left, top, right, bottom) + dividerDrawable!!.draw(c) + } + } + + private fun drawVerticalLine(c: Canvas?, parent: RecyclerView) { + val childCount = parent.childCount + for (i in 0 until childCount) { + val child = parent.getChildAt(i) + val params = child.layoutParams as RecyclerView.LayoutParams + val top = child.top - params.topMargin + val bottom = child.bottom + params.bottomMargin + val left = child.right + params.rightMargin + val right = left + dividerDrawable!!.intrinsicWidth + dividerDrawable!!.setBounds(left, top, right, bottom) + dividerDrawable!!.draw(c!!) + } + } + + override fun getItemOffsets( + outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State + ) { + val spanCount = getSpanCount(parent) + val childCount = Objects.requireNonNull(parent.adapter).itemCount + val itemPosition = parent.getChildAdapterPosition(view) + if (isLastColumn(parent, itemPosition, spanCount, childCount)) { + // 如果是最后一列,则不需要绘制右边 + if (itemPosition == childCount - 1) { + outRect[0, 0, 0] = 0 + } else { + outRect[0, 0, 0] = dividerDrawable!!.intrinsicHeight + } + } else if (isLastRaw(parent, itemPosition, spanCount, childCount)) { + // 如果是最后一行,则不需要绘制底部 + outRect[0, 0, dividerDrawable!!.intrinsicWidth] = 0 + } else { + outRect[0, 0, dividerDrawable!!.intrinsicWidth] = dividerDrawable!!.intrinsicHeight + } + } + + private fun getSpanCount(parent: RecyclerView): Int { + // 列数 + var spanCount = -1 + val layoutManager = parent.layoutManager + if (layoutManager is GridLayoutManager) { + spanCount = layoutManager.spanCount + } else if (layoutManager is StaggeredGridLayoutManager) { + spanCount = layoutManager.spanCount + } + return spanCount + } + + private fun isLastColumn( + parent: RecyclerView, pos: Int, spanCount: Int, childCount: Int + ): Boolean { + var tempCount = childCount + val layoutManager = parent.layoutManager + if (layoutManager is GridLayoutManager) { + // 如果是最后一列,则不需要绘制右边 + return (pos + 1) % spanCount == 0 + } else if (layoutManager is StaggeredGridLayoutManager) { + val orientation = layoutManager.orientation + return if (orientation == StaggeredGridLayoutManager.VERTICAL) { + // 如果是最后一列,则不需要绘制右边 + (pos + 1) % spanCount == 0 + } else { + tempCount -= tempCount % spanCount + // 如果是最后一列,则不需要绘制右边 + pos >= tempCount + } + } + return false + } + + private fun isLastRaw( + parent: RecyclerView, pos: Int, spanCount: Int, childCount: Int + ): Boolean { + var tempCount = childCount + val layoutManager = parent.layoutManager + if (layoutManager is GridLayoutManager) { + var last = tempCount % spanCount + if (last == 0) { + last = spanCount + } + tempCount -= last + // 如果是最后一行,则不需要绘制底部 + return pos >= tempCount + } else if (layoutManager is StaggeredGridLayoutManager) { + val orientation = layoutManager.orientation + // StaggeredGridLayoutManager 且纵向滚动 + return if (orientation == StaggeredGridLayoutManager.VERTICAL) { + var last = tempCount % spanCount + if (last == 0) { + last = spanCount + } + tempCount -= last + // 如果是最后一行,则不需要绘制底部 + pos >= tempCount + } else { + // StaggeredGridLayoutManager 且横向滚动,如果是最后一行,则不需要绘制底部 + (pos + 1) % spanCount == 0 + } + } + return false + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_recommend.xml b/app/src/main/res/layout/fragment_recommend.xml index b2e55a1..f1321d8 100644 --- a/app/src/main/res/layout/fragment_recommend.xml +++ b/app/src/main/res/layout/fragment_recommend.xml @@ -7,6 +7,7 @@ @@ -36,13 +37,14 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:orientation="vertical"> - + android:scrollbars="none" + app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" + app:spanCount="2" /> - + android:scrollbars="none" + app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" + app:spanCount="2" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_featured_goods_rv_g.xml b/app/src/main/res/layout/item_featured_goods_rv_g.xml new file mode 100644 index 0000000..a3fe5e3 --- /dev/null +++ b/app/src/main/res/layout/item_featured_goods_rv_g.xml @@ -0,0 +1,26 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt new file mode 100644 index 0000000..88c3ad6 --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -0,0 +1,49 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.br.R +import com.casic.br.model.FeaturedGoodsModel + +/** + * 精选好物,九宫格Adapter + * */ +class FeaturedGoodsAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_featured_goods_rv_g, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.deviceNameView.text = dataRows[position].deviceName + holder.descriptionView.text = dataRows[position].deviceDesc + holder.itemView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnGridItemClickListener? = null + + interface OnGridItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnGridItemClickListener(clickListener: OnGridItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val descriptionView: TextView = itemView.findViewById(R.id.descriptionView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt b/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt new file mode 100644 index 0000000..84e3596 --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/RecommendAdapter.kt @@ -0,0 +1,50 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.br.R +import com.casic.br.model.FeaturedGoodsModel +import com.casic.br.model.RecommendModel + +/** + * 猜你喜欢,九宫格Adapter + * */ +class RecommendAdapter( + context: Context, private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_recommend_rv_g, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.deviceNameView.text = dataRows[position].deviceName + holder.descriptionView.text = dataRows[position].deviceDesc + holder.itemView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnGridItemClickListener? = null + + interface OnGridItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnGridItemClickListener(clickListener: OnGridItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val descriptionView: TextView = itemView.findViewById(R.id.descriptionView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt index 6cf36e6..68791a0 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/RecommendFragment.kt @@ -2,7 +2,12 @@ import com.bumptech.glide.Glide import com.casic.br.R +import com.casic.br.adapter.FeaturedGoodsAdapter +import com.casic.br.adapter.RecommendAdapter import com.casic.br.model.BannerImageModel +import com.casic.br.model.FeaturedGoodsModel +import com.casic.br.model.RecommendModel +import com.casic.br.utils.GridItemDecoration import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.show import com.youth.banner.Banner @@ -24,7 +29,7 @@ override fun initData() { //TODO 模拟数据 val imageModels = ArrayList() - for (i in 0..5) { + for (i in 0..4) { val model = BannerImageModel() model.imageTitle = "测试轮播图" model.imageLink = "https://img95.699pic.com/photo/40006/1412.jpg_wh860.jpg" @@ -54,6 +59,44 @@ "${imageModel.imageTitle}被点击了".show(requireContext()) } } + + //TODO 模拟数据 + val goodsModels = ArrayList() + for (i in 0..5) { + val model = FeaturedGoodsModel() + model.deviceName = "******热水器" + model.deviceDesc = "描述文字" + + goodsModels.add(model) + } + val featuredGoodsAdapter = FeaturedGoodsAdapter(requireContext(), goodsModels) + goodsRecyclerView.addItemDecoration(GridItemDecoration(requireContext())) + goodsRecyclerView.adapter = featuredGoodsAdapter + featuredGoodsAdapter.setOnGridItemClickListener(object : + FeaturedGoodsAdapter.OnGridItemClickListener { + override fun onItemClick(position: Int) { + + } + }) + + //TODO 模拟数据 + val recommendModels = ArrayList() + for (i in 0..5) { + val model = RecommendModel() + model.deviceName = "智能厨房*****" + model.deviceDesc = "描述文字" + + recommendModels.add(model) + } + val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) + recommendGridView.addItemDecoration(GridItemDecoration(requireContext())) + recommendGridView.adapter = recommendAdapter + recommendAdapter.setOnGridItemClickListener(object : + RecommendAdapter.OnGridItemClickListener { + override fun onItemClick(position: Int) { + + } + }) } override fun initEvent() { diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java new file mode 100644 index 0000000..81d2e03 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -0,0 +1,34 @@ +package com.casic.br.model; + +/** + * 精选好物数据模型 + */ +public class FeaturedGoodsModel { + private String deviceName; + private String deviceImage; + private String deviceDesc; + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceImage() { + return deviceImage; + } + + public void setDeviceImage(String deviceImage) { + this.deviceImage = deviceImage; + } + + public String getDeviceDesc() { + return deviceDesc; + } + + public void setDeviceDesc(String deviceDesc) { + this.deviceDesc = deviceDesc; + } +} diff --git a/app/src/main/java/com/casic/br/model/RecommendModel.java b/app/src/main/java/com/casic/br/model/RecommendModel.java new file mode 100644 index 0000000..3ef8b66 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/RecommendModel.java @@ -0,0 +1,34 @@ +package com.casic.br.model; + +/** + * 猜你喜欢数据模型 + */ +public class RecommendModel { + private String deviceName; + private String deviceImage; + private String deviceDesc; + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceImage() { + return deviceImage; + } + + public void setDeviceImage(String deviceImage) { + this.deviceImage = deviceImage; + } + + public String getDeviceDesc() { + return deviceDesc; + } + + public void setDeviceDesc(String deviceDesc) { + this.deviceDesc = deviceDesc; + } +} diff --git a/app/src/main/java/com/casic/br/utils/GridItemDecoration.kt b/app/src/main/java/com/casic/br/utils/GridItemDecoration.kt new file mode 100644 index 0000000..dfc911d --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/GridItemDecoration.kt @@ -0,0 +1,143 @@ +package com.casic.br.utils + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Rect +import android.graphics.drawable.Drawable +import android.view.View +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.StaggeredGridLayoutManager +import java.util.* + + +class GridItemDecoration(context: Context) : RecyclerView.ItemDecoration() { + private val attrs = intArrayOf(android.R.attr.listDivider) + private var dividerDrawable: Drawable? = null + + init { + val a = context.obtainStyledAttributes(attrs) + dividerDrawable = a.getDrawable(0) + a.recycle() + } + + override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) { + drawHorizontalLine(c, parent) + drawVerticalLine(c, parent) + } + + private fun drawHorizontalLine(c: Canvas, parent: RecyclerView) { + val childCount = parent.childCount + for (i in 0 until childCount) { + val child = parent.getChildAt(i) + val params = child.layoutParams as RecyclerView.LayoutParams + val left = child.left - params.leftMargin + val right = child.right + params.rightMargin + dividerDrawable!!.intrinsicWidth + val top = child.bottom + params.bottomMargin + val bottom = top + dividerDrawable!!.intrinsicHeight + dividerDrawable!!.setBounds(left, top, right, bottom) + dividerDrawable!!.draw(c) + } + } + + private fun drawVerticalLine(c: Canvas?, parent: RecyclerView) { + val childCount = parent.childCount + for (i in 0 until childCount) { + val child = parent.getChildAt(i) + val params = child.layoutParams as RecyclerView.LayoutParams + val top = child.top - params.topMargin + val bottom = child.bottom + params.bottomMargin + val left = child.right + params.rightMargin + val right = left + dividerDrawable!!.intrinsicWidth + dividerDrawable!!.setBounds(left, top, right, bottom) + dividerDrawable!!.draw(c!!) + } + } + + override fun getItemOffsets( + outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State + ) { + val spanCount = getSpanCount(parent) + val childCount = Objects.requireNonNull(parent.adapter).itemCount + val itemPosition = parent.getChildAdapterPosition(view) + if (isLastColumn(parent, itemPosition, spanCount, childCount)) { + // 如果是最后一列,则不需要绘制右边 + if (itemPosition == childCount - 1) { + outRect[0, 0, 0] = 0 + } else { + outRect[0, 0, 0] = dividerDrawable!!.intrinsicHeight + } + } else if (isLastRaw(parent, itemPosition, spanCount, childCount)) { + // 如果是最后一行,则不需要绘制底部 + outRect[0, 0, dividerDrawable!!.intrinsicWidth] = 0 + } else { + outRect[0, 0, dividerDrawable!!.intrinsicWidth] = dividerDrawable!!.intrinsicHeight + } + } + + private fun getSpanCount(parent: RecyclerView): Int { + // 列数 + var spanCount = -1 + val layoutManager = parent.layoutManager + if (layoutManager is GridLayoutManager) { + spanCount = layoutManager.spanCount + } else if (layoutManager is StaggeredGridLayoutManager) { + spanCount = layoutManager.spanCount + } + return spanCount + } + + private fun isLastColumn( + parent: RecyclerView, pos: Int, spanCount: Int, childCount: Int + ): Boolean { + var tempCount = childCount + val layoutManager = parent.layoutManager + if (layoutManager is GridLayoutManager) { + // 如果是最后一列,则不需要绘制右边 + return (pos + 1) % spanCount == 0 + } else if (layoutManager is StaggeredGridLayoutManager) { + val orientation = layoutManager.orientation + return if (orientation == StaggeredGridLayoutManager.VERTICAL) { + // 如果是最后一列,则不需要绘制右边 + (pos + 1) % spanCount == 0 + } else { + tempCount -= tempCount % spanCount + // 如果是最后一列,则不需要绘制右边 + pos >= tempCount + } + } + return false + } + + private fun isLastRaw( + parent: RecyclerView, pos: Int, spanCount: Int, childCount: Int + ): Boolean { + var tempCount = childCount + val layoutManager = parent.layoutManager + if (layoutManager is GridLayoutManager) { + var last = tempCount % spanCount + if (last == 0) { + last = spanCount + } + tempCount -= last + // 如果是最后一行,则不需要绘制底部 + return pos >= tempCount + } else if (layoutManager is StaggeredGridLayoutManager) { + val orientation = layoutManager.orientation + // StaggeredGridLayoutManager 且纵向滚动 + return if (orientation == StaggeredGridLayoutManager.VERTICAL) { + var last = tempCount % spanCount + if (last == 0) { + last = spanCount + } + tempCount -= last + // 如果是最后一行,则不需要绘制底部 + pos >= tempCount + } else { + // StaggeredGridLayoutManager 且横向滚动,如果是最后一行,则不需要绘制底部 + (pos + 1) % spanCount == 0 + } + } + return false + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_recommend.xml b/app/src/main/res/layout/fragment_recommend.xml index b2e55a1..f1321d8 100644 --- a/app/src/main/res/layout/fragment_recommend.xml +++ b/app/src/main/res/layout/fragment_recommend.xml @@ -7,6 +7,7 @@ @@ -36,13 +37,14 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:orientation="vertical"> - + android:scrollbars="none" + app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" + app:spanCount="2" /> - + android:scrollbars="none" + app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" + app:spanCount="2" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_featured_goods_rv_g.xml b/app/src/main/res/layout/item_featured_goods_rv_g.xml new file mode 100644 index 0000000..a3fe5e3 --- /dev/null +++ b/app/src/main/res/layout/item_featured_goods_rv_g.xml @@ -0,0 +1,26 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_recommend_rv_g.xml b/app/src/main/res/layout/item_recommend_rv_g.xml new file mode 100644 index 0000000..a3fe5e3 --- /dev/null +++ b/app/src/main/res/layout/item_recommend_rv_g.xml @@ -0,0 +1,26 @@ + + + + + + + \ No newline at end of file