android - 如何从适配器Kotlin增加通知徽章的计数器

标签 android kotlin

我正在尝试构建具有基本功能的电子商务应用程序。我希望购物车中的物品数量能反射(reflect)在操作栏上。目前,我的用户界面如下所示。
User Interface

为了创建通知,这是我要做的:
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()


    }

关于android - 如何从适配器Kotlin增加通知徽章的计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61701529/

相关文章:

java - 如何获取android :name from <application>

android - 如何在 Android Kotlin 中使用 let 添加两个条件

arrays - 如果键不存在,如何使用默认值制作 map ?

java - 如何在手机 hibernate 时继续使用 onSensorChanged()?

android - 使用 Mockito.verify() 时,不只是检查是否在模拟对象上调用了该函数,而是调用来自真实对象的方法

java - 从 Air Native Extension (android) 显示 ImageView 时出现问题

android - 仅限平板电脑的横向模式

spring-boot - 如何在Cordapp中对服务和 Controller (kotlin)进行单元测试?

java - 如何使用给定对中的键从键/值对列表中检索值?

java - 解决了: SearchView doesn't filter in each child Tab of TabLayout