Home > database >  how to update Textview in main activity with button in adapter?
how to update Textview in main activity with button in adapter?

Time:01-26

i want to update the value of my textview that is in the PosActivity when the button in MyAdapter is click ( to increase/decrease the quantity and to delete the card from recycler view). and i can't find anything on how to do it.

here is what i tried.

in MyAdapter :

package com.mycodlabs.pos.ui.sale.adapter


import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.mycodlabs.pos.R
import com.mycodlabs.pos.domain.inventory.ProductModel
import kotlinx.android.synthetic.main.pos_item_card.view.*
import java.math.BigDecimal


class MyAdapter(mUx: Context, var selectedItems: ArrayList<ProductModel>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {


    val mUx = mUx
//    var quantity = 1
    var totalPrice = BigDecimal.ZERO


    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var pclose = itemView.removeItempos
        var pname = itemView.pos_name
        var pprice = itemView.pos_price
        var pqty = itemView.pos_qty
        var pminus = itemView.cart_minus_img
        var pplus = itemView.cart_plus_img



//        val pimage = itemView.pos_image
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.pos_item_card, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {


        val pos: ProductModel = selectedItems[position]

        holder.pname.text = pos.name
        holder.pprice.text = pos.unitPrice.toString()
        holder.pqty.text = pos.quantity.toString()
//        holder.pimage.= pos.image

        holder.pclose.setOnClickListener {
            val username = pos.name
            var price = pos.unitPrice
            totalPrice -= price
            selectedItems.removeAt(position)
            notifyDataSetChanged()
            notifyItemRangeChanged(position, selectedItems.size)
           // Toast.makeText(mUx, "User $username Deleted", Toast.LENGTH_SHORT).show()
        }

        holder.pminus.setOnClickListener {
            if(pos.quantity == 1 ){
              //  Toast.makeText(mUx,"Can't go any lower", Toast.LENGTH_SHORT).show()
            }else {
                pos.quantity -= 1
                notifyItemChanged(position)
            }
        }
        holder.pplus.setOnClickListener {
              pos.quantity  = 1
            notifyItemChanged(position)
        }
    }
     fun grandTotal(items: ArrayList<ProductModel>): BigDecimal {
         totalPrice = BigDecimal.ZERO
        for (i  in items.indices) {
            totalPrice  = items[i].unitPrice.multiply(items[i].quantity.toBigDecimal())
        }
        return totalPrice
    }

    fun clearData() {
        selectedItems.clear()
        notifyDataSetChanged()
    }
    override fun getItemCount() = selectedItems.size

   }



and in the Activity:

package com.mycodlabs.pos.ui

import android.os.Bundle
import android.view.View
import android.widget.*
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.mycodlabs.pos.R
import com.mycodlabs.pos.db.AndroidDatabase
import com.mycodlabs.pos.db.DatabaseTables
import com.mycodlabs.pos.db.inventory.InventoryDbo
import com.mycodlabs.pos.db.sale.SalesLinesDao
import com.mycodlabs.pos.domain.inventory.ProductModel
import com.mycodlabs.pos.ui.sale.adapter.MyAdapter
import kotlinx.android.synthetic.main.activity_pos.*
import kotlinx.android.synthetic.main.adapter_available_promotions.*
import kotlinx.android.synthetic.main.dialog_paymentsuccession.view.*
import kotlinx.android.synthetic.main.dialog_saleedit.*
import kotlinx.android.synthetic.main.layout_addcategory.*
import kotlinx.android.synthetic.main.layout_sale.*
import kotlinx.android.synthetic.main.listview_stock.*
import kotlinx.android.synthetic.main.pos_bottom_sheet.*
import kotlinx.android.synthetic.main.pos_item_card.*


class PosActivity : AppCompatActivity() {

    private lateinit var bottomSheetBehavior: BottomSheetBehavior<LinearLayout>

    private lateinit var productNames: ArrayList<String>
    private lateinit var recyclerView: RecyclerView
    private lateinit var db: SalesLinesDao
    //// Create an empty list to store the selected items
    var selectedItems = ArrayList<ProductModel>()
    //// Create an adapter for the RecyclerView
    val adapter = MyAdapter(this,selectedItems)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_pos)
        // for Back button
        back.setOnClickListener {
            finish()
        }


        check_out_Pos.setOnClickListener{

//            val pos = ProductModel()
//
//            db = SalesLinesDbo(this)
//
//            pos.name = pos_name.text.toString()
//
//            db.addLineItem(pos.id, LineItemModel())

            adapter.clearData()
        }



//        val autoCompleteTextView = findViewById<AutoCompleteTextView>(R.id.searchBoxPos)
//        autoCompleteTextView.threshold = 0
//        val suggestions =InventoryDbo.getInstance(applicationContext).allProduct
//        var NameArray=suggestions.toList().filter { t -> t.name.contains(autoCompleteTextView)}.toList().map { m->m.name }
//        val arrayAdapter = ArrayAdapter(this, android.R.layout.simple_expandable_list_item_2 ,NameArray)
//        autoCompleteTextView.setAdapter(arrayAdapter)


        // Auto Complete Textview filtering from Product table colm "productName"
        val autoCompleteTextView = findViewById<AutoCompleteTextView>(R.id.searchBoxPos)
        val productNames = ArrayList<String>()
        val dbHelper = AndroidDatabase(this)
        val db = dbHelper.readableDatabase
        val cursor = db.rawQuery(
            "SELECT DISTINCT ${InventoryDbo.colm_productName} FROM ${DatabaseTables.TABLE_PRODUCT} WHERE ${InventoryDbo.colm_productName} like '%%'",
            null
        )
        if (cursor.moveToFirst()) {
            do {
                productNames.add(cursor.getString(cursor.getColumnIndex(InventoryDbo.colm_productName)))
            } while (cursor.moveToNext())
        }
        cursor.close()
        db.close()
        val adapterr = ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, productNames)
        autoCompleteTextView.setAdapter(adapterr)


//        //// Auto Complete suggestion item display in recyclerview on select

//        // Create the RecyclerView
        val recyclerView = findViewById<RecyclerView>(R.id.sale_List_Pos)

//// Create a layout manager for the RecyclerView
        val layoutManager = LinearLayoutManager(this)
        recyclerView.layoutManager = layoutManager




        recyclerView.adapter = adapter


// Set an item click listener for the AutoCompleteTextView
        searchBoxPos.setOnItemClickListener { _, _, position, _ ->

            // Get the selected product name and product from the list
            val selectedItem = autoCompleteTextView.adapter.getItem(position).toString()
//               val selectedProductName = productNames[position]
                val selectedProduct = InventoryDbo.getInstance(applicationContext).getPosProductByName(selectedItem).first()
               //InventoryDbo.getProductByName(selectedProductName)
            // Add the selected product to the selected items list
            selectedItems.add(selectedProduct)
            // Notify the adapter that the data has changed
            adapter.notifyDataSetChanged()
            // Clear the focus and text from the AutoCompleteTextView
            searchBoxPos.clearFocus()
            searchBoxPos.setText("")
            total_items_Pos.text = adapter.grandTotal(selectedItems).toString()
        }




        //for the bottomsheet
        bottomSheetBehavior = BottomSheetBehavior.from<LinearLayout>(std_btm_sht)
        bottomSheetBehavior.setBottomSheetCallback(object :
            BottomSheetBehavior.BottomSheetCallback() {
            override fun onStateChanged(bottomSheet: View, state: Int) {
                print(state)
                when (state) {
                    BottomSheetBehavior.STATE_HIDDEN -> {
                    }
                    BottomSheetBehavior.STATE_EXPANDED -> {
                        total_items_Pos.text = adapter.grandTotal(selectedItems).toString()
                    }
                    BottomSheetBehavior.STATE_COLLAPSED -> {
                        total_items_Pos.text = adapter.grandTotal(selectedItems).toString()
                    }
                    BottomSheetBehavior.STATE_DRAGGING -> {
                        total_items_Pos.text = adapter.grandTotal(selectedItems).toString()
                    }
                    BottomSheetBehavior.STATE_SETTLING -> {
                        total_items_Pos.text = adapter.grandTotal(selectedItems).toString()
                    }
                    BottomSheetBehavior.STATE_HALF_EXPANDED -> {
                        total_items_Pos.text = adapter.grandTotal(selectedItems).toString()
                    }
                }
            }

            override fun onSlide(bottomSheet: View, slideOffset: Float) {
            }
        })
    }

}

i hope you can help me solve this because it was bugging me all day and i couldn't find anything about it

CodePudding user response:

I'll post the changes just for the plus button, you can then repeat it for the others. Mind that this is an example, as I don't in what way you'd like to update the text of the TextView or what's the name of the TextView you already have.

class MyAdapter(
    mUx: Context, 
    var selectedItems: ArrayList<ProductModel>,
    val plusLambda: (String) -> Unit                               // <------
) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {

...

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val pos: ProductModel = selectedItems[position]

...

        holder.pplus.setOnClickListener {
            pos.quantity  = 1
            plusLambda("The new quantity is: ${ pos.quantity }")   // <------
            notifyItemChanged(position)
        }
...
class PosActivity : AppCompatActivity() {

...

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_pos)

...

        val adapterr = ArrayAdapter(this,
           android.R.layout.simple_dropdown_item_1line,
           productNames) {
               someTextView.text = it                              // <------
           }
        autoCompleteTextView.setAdapter(adapterr)
...

Of course, you can use just one lambda for all buttons if all you want to do is to change the text of the TextView.

  • Related