首页 > 解决方案 > 如何将主要活动文本视图的值设置为 BindviewHolder 中的变量。我正在尝试实现使用 firebase 的购物车布局

问题描述

执行此操作时出现空指针异常,我试图将 BindViewHolder 中的总计值设置为我的购物车活动中的金额 textview。有什么办法可以将总价值增加到文本视图的数量?来自 bindViewHolder 还是来自 On Create 函数?

我已经尝试了包括 setText 和 findviewbyId 在内的多种方法,但似乎都不起作用,我仍然在 logcat 中得到错误,要么是空指针异常,要么是尝试在空引用上调用虚拟方法......





var CartItems = ArrayList<CartItemsModel>()
        val adapter = CartAdapter(CartItems)
        cart_recyclerview.adapter = adapter
        cart_recyclerview.layoutManager = LinearLayoutManager(this)

        CoroutineScope(Dispatchers.IO).launch {
            try {
                val snapshotquery = Firebase.firestore.collection("Profiles").document("User").collection("Cart Items").get().await()
                for (document in snapshotquery.documents) {
                    val cartitems = document.toObject<CartItemsModel>()
                    withContext(Dispatchers.Main){
                        CartItems.add(cartitems!!)
                        Toast.makeText(this@cart_activity, "Suu" ,Toast.LENGTH_SHORT).show()
                        adapter.notifyDataSetChanged()
                    }
                }
            }catch (e: Exception){
                withContext(Dispatchers.Main){
                    Toast.makeText(this@cart_activity, e.message, Toast.LENGTH_SHORT).show()
                }
            }

        }








class CartAdapter(
        var cartitems : List<CartItemsModel>
): RecyclerView.Adapter<CartAdapter.CartViewHolder>(){

    inner class CartViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CartViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.cart_recycler_ui, parent, false)
        return CartViewHolder(view)
    }

    override fun getItemCount(): Int {
        return cartitems.size
    }

    override fun onBindViewHolder(holder: CartViewHolder, position: Int) {
        holder.itemView.apply {
            name_of_item_in_cart.text = cartitems[position].Name
            cart_item_price.text = "$"+cartitems[position].Price
            cart_item_quantity.text = cartitems[position].Quantity+"X"
            Glide.with(this).load(cartitems[position].Image.toString()).into(img_of_item_in_cart)

            if (cartitems[position].Price !=null){

                val a = cartitems[position].Price!!.toDouble()
                val b = cartitems[position].Quantity!!.toDouble()

                val total : Double = a * b
//total is the value I want to set to my cart activity's textview
                

            }
        }
    }
}









class CartItemsModel {
    var Name:String? =null
    var Image:String?=null
    var Price:String?=null
    var Quantity:String?=null

    constructor()

    constructor(Name:String,Image:String,Price:String,Quantity:String) {
        this.Name = Name
        this.Image = Image
        this.Price = Price
        this.Quantity = Quantity
    }
}










//My cart Activity
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".cart_activity">

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline9"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.15" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline10"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.05" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/artifika"
        android:text="My Order"
        android:textColor="@color/black"
        android:textSize="30sp"
        app:layout_constraintLeft_toLeftOf="@id/guideline10"
        app:layout_constraintTop_toTopOf="@id/guideline9" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline11"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.90" />

    <TextView
        android:id="@+id/back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="12dp"
        android:fontFamily="@font/alegreya"
        android:text="Shop"
        android:textColor="@color/black"
        android:textSize="18sp"
        app:layout_constraintLeft_toLeftOf="@id/guideline10"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/cart_recyclerview"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="48dp"
        app:layout_constraintBottom_toTopOf="@+id/textView4"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/textView2" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline12"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.70" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/artifika"
        android:text="Total"
        android:textColor="@color/black"
        android:textSize="30sp"
        app:layout_constraintLeft_toLeftOf="@id/guideline10"
        app:layout_constraintTop_toBottomOf="@id/guideline12" />

    <TextView
        android:id="@+id/amount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/artifika"
        android:textColor="@color/black"
        android:textSize="30sp"
        app:layout_constraintRight_toLeftOf="@id/guideline11"
        app:layout_constraintTop_toTopOf="@id/guideline12" />

    <Button
        android:id="@+id/checkout_button"
        style="@style/Theme.Ambergris"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:fontFamily="@font/aref_ruqaa"
        android:text="Checkout"
        android:textAllCaps="false"
        android:textSize="20sp"
        app:layout_constraintBottom_toBottomOf="@id/guideline13"
        app:layout_constraintLeft_toLeftOf="@id/guideline10"
        app:layout_constraintRight_toLeftOf="@id/guideline11"
        app:layout_constraintTop_toBottomOf="@id/amount" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline13"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="1" />

</androidx.constraintlayout.widget.ConstraintLayout>




标签: javaandroidfirebasekotlinandroid-recyclerview

解决方案


在 CartAdapter 中传递数量 textview 作为参数,如下所示

  class CartAdapter(
        var cartitems : List<CartItemsModel>, var txtAmount: TextView
): RecyclerView.Adapter<CartAdapter.CartViewHolder>(){........

然后将其设置在 onBindViewHolder 中,如下所示

txtAmount.text = total

并在购物车活动中将适配器连接到回收站时传递您的 textview id,例如

val adapter = CartAdapter(CartItems,amount)

推荐阅读