java - 如何将主要活动文本视图的值设置为 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>
解决方案
在 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)
推荐阅读
- angular - 从解析器中的链式可观察对象返回数据,等到所有数据都被获取
- java - 关于树莓模型 3 上的 AWS greengrass 边缘计算的问题
- json - SequenceWriter 包裹在数组中不起作用杰克逊
- java - JPA CriteriaQuery 类的“from”方法不接受实体类。引发 IllegalArgumentException
- puppeteer - 在支持方案中登录
- php - json_decode() 在有效 JSON 上返回 NULL,但 json_last_error() 为 0?
- java - JSON 验证在运行时失败,即使测试通过
- appium - org.openqa.selenium.NoSuchElementException:无法通过此策略定位元素:定位器映射:
- jenkins - 无法使用 .bat 文件从 jenkins 中的从站连接到主站
- c# - 记录器未显示在 ASP.NET Core 2.1 应用程序中