Kotlin Fragment中RecyclerView选中商品价格联动弹窗数量算总价求助
修改实现方案
1. 修正商品数据类 Product.kt
原代码中price类型定义错误,且包含多余的无效方法,修改后代码:
package com.gearsrun.popmenuapplication data class Product(var price : Int)
2. 修复列表适配器 ProductAdapter 重复点击问题
原代码在onBindViewHolder和ViewHolder初始化中都设置了点击事件,会触发逻辑冲突,删除onBindViewHolder里重复的点击监听即可,修改后完整代码:
package com.gearsrun.popmenuapplication import android.graphics.Color import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.item_layout.view.* class ProductAdapter(private val productList:List<Product>,private val itemClick:(Int) -> Unit):RecyclerView.Adapter<ProductAdapter.ProductViewHolder>() { private var selectedItemPosition :Int = 0 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProductViewHolder { val itemView = LayoutInflater.from(parent.context).inflate(R.layout.item_layout,parent,false) return ProductViewHolder(itemView,itemClick) } override fun onBindViewHolder(holder: ProductViewHolder, position: Int) { val currentItem = productList[position] holder.price.text = currentItem.price.toString() if(selectedItemPosition == position){ holder.itemView.cardView.setBackgroundColor(Color.parseColor("#FAFAD2")) }else{ holder.itemView.cardView.setBackgroundColor(Color.parseColor("#40E0D0")) } } override fun getItemCount() = productList.size class ProductViewHolder(itemView: View, itemClick: (Int) -> Unit) : RecyclerView.ViewHolder(itemView) { val price : TextView = itemView.price init { itemView.setOnClickListener { itemClick(price.text.toString().toInt()) } } } }
3. 补充Fragment布局文件 fragment_home.xml 总价展示控件
在现有布局中新增一个TextView用于展示计算后的总价格:
<TextView android:id="@+id/totalTv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="总价:0" android:textSize="20sp" android:textColor="@color/black" android:layout_marginTop="20dp"/>
4. 修改HomeFragment.kt实现联动计算逻辑
新增全局变量存储当前选中的单价和数量,新增总价计算方法,选中商品或修改数量时自动触发计算,修改后完整代码:
package com.gearsrun.popmenuapplication.fragment import android.os.Bundle import android.util.Log import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.Menu import android.view.View import android.view.ViewGroup import android.widget.PopupMenu import androidx.recyclerview.widget.LinearLayoutManager import com.gearsrun.popmenuapplication.Product import com.gearsrun.popmenuapplication.ProductAdapter import com.gearsrun.popmenuapplication.R import kotlinx.android.synthetic.main.fragment_home.* class HomeFragment : Fragment(R.layout.fragment_home) { // 存储当前选中的商品单价,默认0 private var currentSelectedPrice = 0 // 存储当前选中的购买数量,默认1 private var currentSelectedCount = 1 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 初始化PopupMenu val popupMenu = PopupMenu( context, selectedTv ) // 添加数量选项 popupMenu.menu.add(Menu.NONE,0,0,"1") popupMenu.menu.add(Menu.NONE,1,1,"2") popupMenu.menu.add(Menu.NONE,2,2,"3") popupMenu.menu.add(Menu.NONE,3,3,"4") popupMenu.menu.add(Menu.NONE,4,4,"5") // 处理数量选择逻辑 popupMenu.setOnMenuItemClickListener {menuItem -> val id = menuItem.itemId currentSelectedCount = id + 1 selectedTv.text = currentSelectedCount.toString() // 数量变更后重新计算总价 calculateTotalPrice() true } // 点击显示数量选择弹窗 selectedTv.setOnClickListener { popupMenu.show() } // 初始化RecyclerView val productList = generateProductList() fun selectFuntion(itemPrice: Int){ Log.e("haha","选中商品单价:${itemPrice}") currentSelectedPrice = itemPrice // 选中商品后重新计算总价 calculateTotalPrice() } var adapter = ProductAdapter(productList,::selectFuntion) giftRecycleView.adapter = adapter giftRecycleView.layoutManager = LinearLayoutManager(context,LinearLayoutManager.HORIZONTAL,false) } // 计算总价并更新UI private fun calculateTotalPrice() { val total = currentSelectedPrice * currentSelectedCount totalTv.text = "总价:${total}" } private fun generateProductList():List<Product> { val list = ArrayList<Product>() list.add(Product(1)) list.add(Product(2)) list.add(Product(3)) return list } }
内容的提问来源于stack exchange,提问作者Yellow Clock
相关产品推荐
相关产品推荐

