You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 18:39:01