我正在尝试构建具有基本功能的电子商务应用程序。我希望购物车中的物品数量能反射(reflect)在操作栏上。目前,我的用户界面如下所示。
为了创建通知,这是我要做的:
cart_layout.xml:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="55sp"
android:paddingRight="10sp"
android:gravity="center">
<ImageView
android:id="@+id/cart_img"
android:layout_width="30sp"
android:layout_height="30sp"
android:background="@drawable/shopping"
android:foreground="?attr/selectableItemBackgroundBorderless" />
<TextView
android:id="@+id/item_count"
android:layout_width="18sp"
android:textAlignment="center"
android:layout_height="18sp"
android:textColor="@android:color/white"
android:text="0"
android:textSize="12sp"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="21dp"
android:layout_marginTop="5dp"
android:background="@drawable/itemcount" />
</RelativeLayout>
</RelativeLayout>
我在菜单目录中的 cart_menu.xml 如下所示:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/select_cart"
app:showAsAction="always"
app:actionLayout="@layout/cart_layout"
android:title="Cart"/>
<item android:id="@+id/toolbar_search"
android:title="Search"
android:icon="@drawable/ic_search_black_24dp"
app:showAsAction ="always"
app:actionViewClass="android.widget.SearchView"/>
</menu>
我在Activity中的onCreateOptionsMenu 函数上的如下所示:
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.cart_menu, menu)
val count:View = menu!!.findItem(R.id.select_cart).actionView
val itemText:TextView = count.findViewById(R.id.item_count)
if(cartList.size == 0){
itemText.visibility = View.INVISIBLE
}
if(cartList.size > 0) {
itemText.visibility = View.VISIBLE
itemText.text = cartList.size.toString()
}
return true
}
这里 cartList 是购物车中商品的MutableList。
我想做的是每当用户单击“添加到购物车” 按钮时,更新此购物车的计数器。
Adapter类中提供了此按钮的单击侦听器。
我在 ProductAdapter.kt里面的 onBindViewHolder 上的 onclicklistener 看起来像这样:
holder.addToCart.setOnClickListener {
holder.count.number = 1.toString()
Log.d("Product","Clicked ${product.name}, count = ${holder.count.number}")
val cartItemObj = CartItem(product.name,product.imageUrl, product.size, product.price, holder.count.number)
val db = CartDatabase(context)
val result = db.insertData(cartItemObj)
if(result == (-1).toLong()){
Log.d("ProductAdapter","Error in Inserting values")
return@setOnClickListener
}
holder.addToCart.visibility = View.INVISIBLE
holder.count.visibility = View.VISIBLE
cartList.add(cartItemObj)
// SOME CODE HERE TO UPDATE THE NUMBER OF ITEMS IN CART
}
由于无法访问适配器内的Textview,因此我不知道应该如何实现。
完整项目的链接是:
Here
最佳答案
定义购物车数量
var cartCounter: Int? = 0
//private lateinit var itemText: TextView
lateinit var itemText: TextView
然后用
onCreateOptionsMenu
方法更新它override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.cart_menu, menu)
val count:View = menu!!.findItem(R.id.select_cart).actionView
itemText:TextView = count.findViewById(R.id.item_count)
if(cartList.size == 0){
itemText.visibility = View.INVISIBLE
}
if(cartList.size > 0) {
cartCounter = cartList.size;
itemText.visibility = View.VISIBLE
itemText.text = cartCounter.toString()
}
return true
}
最后,当用户单击添加到购物车时,再次对其进行更新
holder.addToCart.setOnClickListener {
holder.count.number = 1.toString()
val cartItemObj = CartItem(product.name,product.imageUrl, product.size, product.price, holder.count.number)
val db = CartDatabase(context)
val result = db.insertData(cartItemObj)
if(result == (-1).toLong()){
Log.d("ProductAdapter","Error in Inserting values")
return@setOnClickListener
}
holder.addToCart.visibility = View.INVISIBLE
holder.count.visibility = View.VISIBLE
cartList.add(cartItemObj)
cartCounter = cartCounter + 1;
// or cartCounter = cartCounter + quantity_of_item;
itemText.text = cartCounter.toString()
}