从适配器类调用 Fragment 方法

时间:2021-01-23 18:56:48

标签: android android-studio kotlin android-fragments

我使用 Groupie 作为回收视图适配器并且 我能够在课堂内调用一个活动方法。 调用该方法的代码如下所示。

(it.context as <activity_name>).<function_name>()

但问题是我想知道如何从类内的片段调用方法? 这是我的代码

    class BindCartItemList(val cartItem: CartList) : Item<GroupieViewHolder>() {

    override fun getLayout() = R.layout.ryr_cartlist_with_select

    override fun bind(viewHolder: GroupieViewHolder, position: Int) {

        viewHolder.itemView.ryr_product_name.text = cartItem.product?.productName
        viewHolder.itemView.ryr_quantity.setText(cartItem.quantity.toString())
        viewHolder.itemView.ryr_product_barcode.text = cartItem.product?.productBarcode

        //compact conversion
        val mConvert = FormatConversion()

        //default for display price and amount
        viewHolder.itemView.ryr_unit_price.text = mConvert.compactAmount(cartItem.product?.price!!)

        cartItem.amount = cartItem.quantity * cartItem.product?.price!!
        viewHolder.itemView.ryr_amount.text = mConvert.compactAmount(cartItem.amount)

        //quantity decrease
        viewHolder.itemView.ryr_btn_decrease.setOnClickListener {
            cartItem.quantity -= 1
            //not allow user set qty < 1
            if (cartItem.quantity < 1) {
                cartItem.quantity = 1
            } else {
                //once button press qty and amount will be change
                viewHolder.itemView.ryr_quantity.setText(cartItem.quantity.toString())

                cartItem.amount = cartItem.quantity * cartItem.product?.price!!
                viewHolder.itemView.ryr_amount.text = mConvert.compactAmount(cartItem.amount)
            }
            (it.context as PosActivity).updateTotalAmount()
        }

        //quantity increase
        viewHolder.itemView.ryr_btn_increase.setOnClickListener {
            cartItem.quantity += 1
            viewHolder.itemView.ryr_quantity.setText(cartItem.quantity.toString())

            cartItem.amount = cartItem.quantity * cartItem.product?.price!!
            viewHolder.itemView.ryr_amount.text = mConvert.compactAmount(cartItem.amount)

            (it.context as PosActivity).updateTotalAmount()

        }


        //press container_1 for checkbox
        viewHolder.itemView.ryr_container_1.setOnClickListener {
            if (viewHolder.itemView.ryr_selected.isChecked) {
                viewHolder.itemView.ryr_selected.isChecked = false
                cartItem.selected = false
            } else if (!viewHolder.itemView.ryr_selected.isChecked) {
                viewHolder.itemView.ryr_selected.isChecked = true
                cartItem.selected = true
            }
        }

    }


}

这是在活动中有效但在片段中无效的代码

1 个答案:

答案 0 :(得分:1)

通常您的数据类以及您的 Item 不应该是可变的,在这种情况下,它看起来像这样:

class BindCartItemList(val cartItem: CartList, val actionHandler: ActionHandler) : Item<GroupieViewHolder>() {
    interface ActionHandler {
        fun onCartItemDecreaseClicked(cartItem: CartList)

        fun onCartItemIncreaseClicked(cartItem: CartList)

        fun onCartItemSelectionToggled(cartItem: CartList, shouldBeChecked: Boolean)
    }

    private val mConvert = FormatConversion() // compact conversion

    override fun getLayout() = R.layout.ryr_cartlist_with_select

    override fun bind(viewHolder: GroupieViewHolder, position: Int) {

        viewHolder.itemView.ryr_product_name.text = cartItem.product?.productName
        viewHolder.itemView.ryr_quantity.setText(cartItem.quantity.toString())
        viewHolder.itemView.ryr_product_barcode.text = cartItem.product?.productBarcode

        viewHolder.itemView.ryr_amount.text = mConvert.compactAmount(cartItem.quantity * cartItem.product?.price!!)

        //quantity increase
        viewHolder.itemView.ryr_btn_increase.setOnClickListener {
            actionHandler.onCartItemIncreaseClicked(cartItem)
        }

        //quantity decrease
        viewHolder.itemView.ryr_btn_decrease.setOnClickListener {
            actionHandler.onCartItemDecreaseClicked(cartItem)
        }

        //press container_1 for checkbox
        viewHolder.itemView.ryr_container_1.setOnClickListener {
            val isChecked = viewHolder.itemView.ryr_selected.isChecked
            actionHandler.onCartItemSelectionToggled(cartItem, !isChecked)
        }
    }    
}

所有其他更改都属于适配器项之外,并且可能会在 Fragment 中处理。

class YourFragment: Fragment(), BindCartItemList.ActionHandler {
    ....

要更新项目,您可以刷新适配器中的项目,也可以使用 item.notifyChanged()