SnorSnor
SnorSnor

Reputation: 13

Call Fragment Method from adapter class

I'm using Groupie as a recycle view adapter and I was able to call a activity method inside the class. the code that call the method as show below.

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

but the problem is i wonder how to call a method from a fragment inside the class? Here is my code

    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
            }
        }

    }


}

Here is the code that work at activity but not work in fragment

Upvotes: 0

Views: 223

Answers (1)

EpicPandaForce
EpicPandaForce

Reputation: 81529

Generally your data classes and therefore your Items shouldn't be mutable, in that case, it'd look like so:

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)
        }
    }    
}

All other mutations belong outside of the adapter item, and could potentially be handled in the Fragment.

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

To update the item, you can either refresh the items in the adapter, or you can use item.notifyChanged().

Upvotes: 1

Related Questions