How do I take data from a firebase database and show it in a recycler view? - kotlin

Im trying to get data from a firebase database collection and show it in a recycler view.
My collection is called savedDailyPlan. I am super new to kotlin and to android studio and I'm having a hard time finding the solution to this problem.
This is my data class:
data class DoneExercise(
var exerciseName : String = "",
var weight : Int = 0,
var sets : Int = 0,
var reps : Int = 0,
var date : Timestamp = Timestamp.now()
)
This is my adapter:
class DailyWorkoutAdapter(private val items: List<DoneExercise>) : RecyclerView.Adapter<DailyWorkoutAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.plan_list_item, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = items[position]
holder.property1.text = item.exerciseName
holder.property2.text = item.weight.toString()
//holder.property3.text = item.sets.toString()
//holder.property4.text = item.reps.toString()
}
override fun getItemCount(): Int = items.size
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val property1: TextView = itemView.findViewById(R.id.tv_day_name)
val property2: TextView = itemView.findViewById(R.id.tv_exercise_name)
//val property3: TextView = itemView.findViewById(R.id.property3)
//val property4: TextView = itemView.findViewById(R.id.property4)
}
}
I tried this but nothing shows up after i press the Positive Button:
private fun showPlanDialog() {
val db = FirebaseFirestore.getInstance()
val collectionRef = db.collection("savedDailyPlan")
val showDailyWorkoutHelper = LayoutInflater.from(context).inflate(R.layout.show_daily_exercises, null)
val dialogHelperDaily= ShowDailyWorkoutHelper(showDailyWorkoutHelper)
AlertDialog.Builder(context)
.setView(showDailyWorkoutHelper)
.setTitle("Generate plan")
.setPositiveButton("Choose day") {_, _ ->
recyclerView.layoutManager = LinearLayoutManager(context)
val dailyWorkoutsList: MutableList<DoneExercise> = arrayListOf()
val dailyWorkoutAdapter = DailyWorkoutAdapter(dailyWorkoutsList)
recyclerView.adapter = dailyWorkoutAdapter
}.show()
}
The Choose day part is something im planning on adding later, where I'd want to get only specific data from the collection (exercises that were created only for a certain date).

Related

Update firestore data from populated recycler View

I want to update firestore data which I have got in a Recycler view.
Recycler View Activity Code
class AdminActivity : AppCompatActivity() {
private val dB = Firebase.firestore
private lateinit var userRecyclerView: RecyclerView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
supportActionBar?.title = "Admin Panel"
userRecyclerView = findViewById(R.id.user_list)
userRecyclerView.layoutManager = LinearLayoutManager(this)
userRecyclerView.setHasFixedSize(true)
val query = dB.collection("users")
val options = FirestoreRecyclerOptions.Builder<User>().setQuery(query, User::class.java)
.setLifecycleOwner(this).build()
//adapter
val adapter = object : FirestoreRecyclerAdapter<User, UserViewHolder>(options) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
val view = LayoutInflater.from(this#AdminActivity)
.inflate(R.layout.user_item, parent, false)
return UserViewHolder(view)
}
override fun onBindViewHolder(holder: UserViewHolder, position: Int, model: User) {
val nameTv: TextView = holder.itemView.findViewById(R.id.name_textview)
val idTv: TextView = holder.itemView.findViewById(R.id.id_textview)
val phoneTv: TextView = holder.itemView.findViewById(R.id.phone_textview)
nameTv.text = model.name
idTv.text = model.id
phoneTv.text = model.phone
holder.itemView.setOnClickListener {
val intent = Intent(baseContext, AdminViewActivity::class.java)
startActivity(intent)
}
}
}
userRecyclerView.adapter = adapter
}
}
I want to update the data when i click on the holder.
Only update the data of the user whose recycler view I clicked.
Firestore Database Image

How to delete a record in room database with recyclerview MVVM

I need to delete an item recyclerview adapter which should be notified in room database, please help me in finding a solution and thanks in advance
class ListAdapter : RecyclerView.Adapter<ListAdapter.MyViewHolder>() {
private lateinit var mitemsViewModel: ItemsViewModel
private var itemsList = emptyList<Item>()
private lateinit var item: Item
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
return MyViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.item_row_layout, parent, false)
)
}
override fun getItemCount(): Int {
return itemsList.size
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
item = itemsList.get(position)
//always remember this technique to save the values in val type
val currentItem = itemsList[position]
holder.itemView.itemNameTV.text = currentItem.itemName.toString()
holder.itemView.itemCodeTV.text = currentItem.itemCode.toString()
holder.itemView.itemCategoryTV.text = currentItem.itemCategory.toString()
holder.itemView.itemDescriptionTV.text = currentItem.itemDescription.toString()
holder.itemView.itemSellingPriceTV.text = currentItem.itemSellingPrice.toString()
holder.itemView.itemStockTV.text = currentItem.itemStock.toString()
holder.itemView.deleteItem.setOnClickListener {
val itName = holder.itemView.itemNameTV.text.toString()
val itCode = holder.itemView.itemCodeTV.text.toString()
val itCategory = holder.itemView.itemCategoryTV.text.toString()
val itDescription = holder.itemView.itemDescriptionTV.text.toString()
val itSellingPrice = holder.itemView.itemSellingPriceTV.text.toString()
val itStock = holder.itemView.itemStockTV.text.toString()
val itime = Item(0, itName, itCode, itCategory, itSellingPrice, itStock, itDescription)
mitemsViewModel.deleteItem(itime)
//dao.deleteItem(itemsList.get(position))
}
}
fun setData(item: List<Item>) {
this.itemsList = item
notifyDataSetChanged()
}}
Help me how to initialize the ViewModel in recyclerview adapter.
The error code after running my app
kotlin.UninitializedPropertyAccessException: lateinit property mitemsViewModel has not been initialized
at com.manju.mobilebilling.ui.items.ListAdapter.onBindViewHolder$lambda-0(ListAdapter.kt:65)
at com.manju.mobilebilling.ui.items.ListAdapter.$r8$lambda$pJauI4KaymNCF6j043M3H3t3CwQ(ListAdapter.kt)
at com.manju.mobilebilling.ui.items.ListAdapter$$ExternalSyntheticLambda0.onClick(D8$$SyntheticClass)
at android.view.View.performClick(View.java:5651)
at android.view.View$PerformClick.run(View.java:22445)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6138)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:893)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)
You should initialize the ItemsViewModel in the parent Activity or Fragment:
private val viewModel by viewModels<ItemsViewModel>()
Then, instead of passing it directly to the ListAdapter declare a custom click listener and use that as parameter:
// Add a parameter in the adapter
class ListAdapter(
private val clickListener: ListClickListener
) : RecyclerView.Adapter<ListAdapter.MyViewHolder>() {
private var itemsList = emptyList<Item>()
private lateinit var item: Item
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
return MyViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.item_row_layout, parent, false)
)
}
override fun getItemCount(): Int {
return itemsList.size
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
item = itemsList.get(position)
//always remember this technique to save the values in val type
val currentItem = itemsList[position]
holder.itemView.itemNameTV.text = currentItem.itemName.toString()
holder.itemView.itemCodeTV.text = currentItem.itemCode.toString()
holder.itemView.itemCategoryTV.text = currentItem.itemCategory.toString()
holder.itemView.itemDescriptionTV.text = currentItem.itemDescription.toString()
holder.itemView.itemSellingPriceTV.text = currentItem.itemSellingPrice.toString()
holder.itemView.itemStockTV.text = currentItem.itemStock.toString()
holder.itemView.deleteItem.setOnClickListener {
val itName = holder.itemView.itemNameTV.text.toString()
val itCode = holder.itemView.itemCodeTV.text.toString()
val itCategory = holder.itemView.itemCategoryTV.text.toString()
val itDescription = holder.itemView.itemDescriptionTV.text.toString()
val itSellingPrice = holder.itemView.itemSellingPriceTV.text.toString()
val itStock = holder.itemView.itemStockTV.text.toString()
val itime = Item(0, itName, itCode, itCategory, itSellingPrice, itStock, itDescription)
// Call the click listener
clickListener.onClick(iitem)
}
}
fun setData(item: List<Item>) {
this.itemsList = item
notifyDataSetChanged()
}
}
// Click listener class
class ListClickListener(val clickListener: (item: Item) -> Unit) {
fun onClick(item: Item) = clickListener(item)
}
Finally, declare your ListAdapter in the parent Activity or Fragment with:
val adapter = ListAdapter(ListClickListener { item ->
viewModel.deleteItem(item)
})
Initialize your viewmodel in your activity than pass it via adapter constructor

How to pass intent with Adapter in Kotlin

I would like to pass intent to another activity class with Adapter via OnClick function in Kotlin. However, when I am using the debug function, I noticed that the intent has not passed successfully. May I know how can I solve this? From various sources online, I realized that I may be required to called the gList inside the "OnClick" function, but I cant seem to work it out.
class GoalAdapter(
private var gList: ArrayList<GoalList>
) : RecyclerView.Adapter<GoalAdapter.MyViewHolder>(), View.OnClickListener{
private var connection : Connection? = null
private var statement : Statement? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val v: View = LayoutInflater.from(parent.context).inflate(R.layout.activity_goal_list, parent, false)
return MyViewHolder(v)
}
override fun getItemCount(): Int {
return gList.size
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val list = gList[position]
holder.goal.text = list.gName
holder.tAmount.text = list.tAmount.toString()
holder.sAmount.text = list.sAmount.toString()
holder.gnote.text = list.Note
holder.gdate.text = list.dDate
val sqlCon = SQLCon()
connection = sqlCon.connectionClass()!!
holder.delete.setOnClickListener {
try
{
val sql : String= "DELETE FROM Goals where gName = '${list.gName}' "
statement = connection!!.createStatement()
statement!!.executeQuery(sql)
}
catch (e : Exception)
{ }
}
holder.update.setOnClickListener(this)
}
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var goal: TextView = itemView.findViewById(R.id.txtGoal)
var tAmount : TextView = itemView.findViewById(R.id.txtTargetAmount)
var sAmount : TextView = itemView.findViewById(R.id.txtSavedAmount)
var gnote : TextView = itemView.findViewById(R.id.txtNote)
var gdate : TextView = itemView.findViewById(R.id.txtDate)
var delete : Button = itemView.findViewById(R.id.btnDeleteGoal)
var update : Button = itemView.findViewById(R.id.btnUpdateGoal)
}
override fun onClick(view: View?) {
when(view?.id)
{
R.id.btnUpdateGoal ->
{
val intent = Intent(view.context, EditGoalActivity::class.java)
intent.putExtra("gName", R.id.txtGoal)
intent.putExtra("tAmount", R.id.txtTargetAmount )
intent.putExtra("sAmount", R.id.txtSavedAmount )
intent.putExtra("Note", R.id.txtNote )
intent.putExtra("dDate", R.id.txtDate )
view.context.startActivity(intent)
}
}
}
}

Struggling to access Spinner outside of my recycler view

I have tried two different ways to access my spinner. Without success thus far.
I want to load the data for each driver as chosen.
To give an idea of my app.
Code for adapter:
class TableViewAdapter(var tripsheetlist: Tripsheetlist) : RecyclerView.Adapter<TableViewAdapter.RowViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RowViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(R.layout.table_list_item, parent, false)
return RowViewHolder(itemView) }
override fun getItemCount(): Int { return tripsheetlist.videos.size + 1 // one more to add header row
}
override fun onBindViewHolder(holder: RowViewHolder, position: Int) {
val rowPos = holder.adapterPosition
if (rowPos == 0) {
// Header Cells. Main Headings appear here
holder.itemView.apply {
setHeaderBg(txtWOrder)
setHeaderBg(txtDElNote)
setHeaderBg(txtCompany)
// setHeaderBg(txtAddress)
setHeaderBg(txtWeight)
setHeaderBg(txtbutton1)
setHeaderBg(txtbutton2)
setHeaderBg(txttvdone)
txtWOrder.text = "WOrder"
txtDElNote.text = "DElNote"
txtCompany.text = "Company"
// txtAddress.text = "Address"
txtWeight.text = "Weight"
txtbutton1.text = "Delivered"
txtbutton2.text = "Exception"
txttvdone.text = ""
}
} else {
val modal = tripsheetlist.videos[rowPos -1]
holder.itemView.apply {
setContentBg(txtWOrder)
setContentBg(txtDElNote)
setContentBg(txtCompany)
setContentBg(txtWeight)
setContentBg(txtbutton1)
setContentBg(txtbutton2)
setContentBg(txttvdone)
val list : MutableList<String> = ArrayList()
list.add("Deon")
list.add("Leon")
list.add("David")
list.add("Dick")
println(list)
val spinner : Spinner = findViewById(R.id.spnDriver)
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
val item :String = list[p2]
if (item == "David")
{
txtWOrder.text = modal.WOrder.toString()
txtDElNote.text = modal.DElNote.toString()
txtCompany.text = modal.name.toString()
txtWeight.text = modal.id.toString()
}
}
override fun onNothingSelected(p0: AdapterView<*>?) {
}
}
I did it like this as a test for now. As I will get the drivers from my JSON. I don't have access to it yet so that is why the static values.
The problem I am getting now is: findViewById(R.id.spnDriver) must not be null
I first had my spinner class in my main activity and passed it over like this:
val list : MutableList<String> = ArrayList()
list.add("Deon")
list.add("Leon")
list.add("David")
list.add("Dick")
list.add("Jim")
list.add("Harry")
val adapter = ArrayAdapter( this, androidx.appcompat.R.layout.support_simple_spinner_dropdown_item, list)
val spinner: Spinner = findViewById(R.id.spnDriver)
spinner.adapter = adapter
spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
val item :String = list[p2]
Toast.makeText(this#MainActivity, "Driver $item selected", Toast.LENGTH_SHORT).show()
}
override fun onNothingSelected(p0: AdapterView<*>?) {
//empty
}
// insert code that activates data pull of tripsheet for driver= actifavte by method the class/object that activates the data pull. so datapuul(Driver)
}
limitDropDownHeight(spinner)
//drivers end
val btnLoadData: Button = findViewById(R.id.btnLoadData)
// weightsum(tvTotalweight, Tripsheetlist)
// totaldelNotes(tvTotaldelv,Tripsheetlist)
// setData(btnLoadData, Tripsheetlist )
fetchJson(spinner)
}
private fun fetchJson(spinner: Spinner) {
println("Attempting to Fetch JSON")
val url = "https://api.letsbuildthatapp.com/youtube/home_feed"
val request = Request.Builder().url(url).build()
val client = OkHttpClient()
client.newCall(request).enqueue(object: Callback {
override fun onFailure(call: Call, e: IOException) {
println("Failed to execute request") }
override fun onResponse(call: Call, response: Response) {
val body = response.body?.string()
println(body)
val gson = GsonBuilder().create()
val tripsheetlist = gson.fromJson(body, Tripsheetlist::class.java)
runOnUiThread {
recyclerViewTripsheetlist.adapter = TableViewAdapter(tripsheetlist, spinner)
}
}
})
}
In my Adapter class I then called it with : val spinner = spnDriver
This led to a different error: AppCompatSpinner.setOnItemSelectedListener(android.widget.AdapterView$OnItemSelectedListener)' on a null object reference
But seems like it passed the val spinner =spnDriver without a problem.
Thank you for all input and help.
I found a solution. What I did was to keep the spinner inside my MainActivity and then just pass the result of the spinner to the adapter - where I wanted to use it.

is there a way to change the textview text in the MainActivity whenever the text in recyclerview row changed in Kotlin

I an trying to do a simple app, in which I use RecyclerView.
Here are my files.
MainActivity.kt
activity_main.xml --> which has RecyclerView (recylerViewMain)
single_row.xml --> single row for recyclerViewMain
MainAdapter.kt --> where all bindings , ViewHolder and inflating
I have also
Product.kt --> model for Products
Now, here what i am trying to do.
I have added Plus and Minus buttons on the side of itemUnit and whenever i click those items it does the job i wanted, increasing the itemUnit and eventually, itemAmount
However, this happens only on Row, and it doesn't change the Sub Total (TextView) in main_activity.xml file.
Is there a way to change the main_activity textView whenever textView in the Row of Recyclerview changes (or whenever button clicked on the row) ?
I am editing the code here.
Sub Total amount doesn't change until I click an item button (Granola, Brownie etc.). Only after I click the these items Sub Total changes and gives the updated amount.
the interface solution didnt work for me, I think I couldnt implement it right.
here are the codes ;
class MainActivity : AppCompatActivity(), ItemChangeListener {
override var subTotalAmnt: Double = 30.0
//override var subTotalAmount: Double = 50.0
//override fun onItemPriceChange(20.0)
lateinit var mRecyclerView : RecyclerView
private lateinit var sDatabase: DatabaseReference
var trId: Long = 0
var discAmnt : Double = 0.00
var unt = 1
var tr :Trans ?= null
var sb = 0.00
var disc = sb*.1
var tt = sb-disc
var list = ArrayList<Product>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
//var subto = findViewById(R.id.txtSubAmount) as TextView
onItemPriceChange(20.0)
txtSubAmount.text = subTotalAmnt.toString()
sDatabase = FirebaseDatabase.getInstance().getReference().child("Sales")
sDatabase.child("Sales").addValueEventListener(object:ValueEventListener{
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: DataSnapshot) {
if(p0.exists()) {
trId = p0.childrenCount
println(trId)
}
}
})
mRecyclerView = findViewById(R.id.recyclerView_main)
mRecyclerView.layoutManager = LinearLayoutManager(this)
mRecyclerView.adapter = MainAdapter(this, list)
and my Adapter Class;
class MainAdapter(val context: Context, val items : List<Product>) : RecyclerView.Adapter<MainAdapter.PartViewHolder>() {
override fun onBindViewHolder(p0: MainAdapter.PartViewHolder, p1: Int) {
p0.bindItems(items[p1])
}
var itemListener: ItemChangeListener? = null
fun setListener(listener: ItemChangeListener) {
this.itemListener = listener
}
override fun getItemId(position: Int): Long {
return super.getItemId(position)
}
override fun getItemCount(): Int {
return items.size
}
// Inflates the item views
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PartViewHolder {
// LayoutInflater: takes ID from layout defined in XML.
// Instantiates the layout XML into corresponding View objects.
// Use context from main app -> also supplies theme layout values!
val inflater = LayoutInflater.from(parent.context)
// Inflate XML. Last parameter: don't immediately attach new view to the parent view group
val view = inflater.inflate(R.layout.sinlge_row, parent, false)
return PartViewHolder(view)
}
// Binds each product in the ArrayList to a view
inner class PartViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
// Holds the TextView that will add each product to
fun bindItems(prd: Product) {
val textViewName = itemView.txtOrderNumber
var textViewUnit = itemView.txtItemUnit
val textViewPrice = itemView.txtItemPrice
val textViewAmount = itemView.txtItemAmount
var id = adapterPosition
var unitN: Int = 1
textViewName.text = prd.pName
textViewUnit.text = prd.pUnit.toString()
textViewPrice.text = prd.pPrice.toString()
var itemPrice = prd.pPrice
var itemAmount = itemPrice.times(unitN)
textViewAmount.text = itemAmount.toString()
itemView.btnPlus.setOnClickListener {
println("item id : " + id)
//itemListener = ItemChangeListener
itemListener?.onItemPriceChange(10.0)
// increase the Product model single unit
prd.pUnit = unitN++
// println("Here is the " +MainActivity().list.get(id))
// bind txtItemUnit from single_row to changed unitN (single unit)
textViewUnit.text = unitN.toString()
// change the Product model single pAmount
prd.pAmount = prd.pPrice.times(unitN)
// bind txtItemAmount from single_row to Product pAmount
textViewAmount.text = prd.pAmount.toString()
//txtSubAmount.txt =
//MainActivity().doSomething(subTotalAmount)
}
itemView.btnMinus.setOnClickListener(View.OnClickListener {
if (unitN >= 1) {
prd.pUnit = unitN--
println(prd.pUnit)
textViewUnit.text = unitN.toString()
textViewAmount.text = prd.pPrice.times(unitN).toString()
} else
prd.pUnit = 1
textViewUnit.text = prd.pUnit.toString()
textViewAmount.text = prd.pPrice.times(prd.pUnit).toString()
})
}
}
}
and, Interface
interface ItemChangeListener {
var subTotalAmnt : Double
fun onItemPriceChange(subTotalAmount : Double){
this.subTotalAmnt = subTotalAmount
println("onItemPriceChange "+subTotalAmnt)
}
}
I am sorry for this terrible explanation as I am not native, but willing to explain more for help.
Kind Regards.
Edited MainAdapter
class MainAdapter(val context: Context, val items : List<Product>) : RecyclerView.Adapter<MainAdapter.PartViewHolder>() {
override fun onBindViewHolder(p0: MainAdapter.PartViewHolder, p1: Int) {
p0.bindItems(items[p1])
}
lateinit var itemListener: ItemChangeListener
fun setListener(listener: ItemChangeListener) {
this.itemListener = listener
}
override fun getItemId(position: Int): Long {
return super.getItemId(position)
}
override fun getItemCount(): Int {
return items.size
}
// Inflates the item views
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PartViewHolder {
// LayoutInflater: takes ID from layout defined in XML.
// Instantiates the layout XML into corresponding View objects.
// Use context from main app -> also supplies theme layout values!
val inflater = LayoutInflater.from(parent.context)
// Inflate XML. Last parameter: don't immediately attach new view to the parent view group
val view = inflater.inflate(R.layout.sinlge_row, parent, false)
return PartViewHolder(view)
}
// Binds each product in the ArrayList to a view
inner class PartViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
// Holds the TextView that will add each product to
fun bindItems(prd: Product) {
val textViewName = itemView.txtOrderNumber
var textViewUnit = itemView.txtItemUnit
val textViewPrice = itemView.txtItemPrice
val textViewAmount = itemView.txtItemAmount
var id = adapterPosition
var unitN: Int = 1
textViewName.text = prd.pName
textViewUnit.text = prd.pUnit.toString()
textViewPrice.text = prd.pPrice.toString()
var itemPrice = prd.pPrice
var itemAmount = itemPrice.times(unitN)
textViewAmount.text = itemAmount.toString()
itemView.btnPlus.setOnClickListener {
println("item id : " + id)
//itemListener = ItemChangeListener
itemListener.onItemPriceChange(20.0)
// increase the Product model single unit
prd.pUnit = unitN++
// println("Here is the " +MainActivity().list.get(id))
// bind txtItemUnit from single_row to changed unitN (single unit)
textViewUnit.text = unitN.toString()
// change the Product model single pAmount
prd.pAmount = prd.pPrice.times(unitN)
// bind txtItemAmount from single_row to Product pAmount
textViewAmount.text = prd.pAmount.toString()
//txtSubAmount.txt =
//MainActivity().doSomething(subTotalAmount)
}
itemView.btnMinus.setOnClickListener(View.OnClickListener {
if (unitN >= 1) {
prd.pUnit = unitN--
println(prd.pUnit)
textViewUnit.text = unitN.toString()
textViewAmount.text = prd.pPrice.times(unitN).toString()
} else
prd.pUnit = 1
textViewUnit.text = prd.pUnit.toString()
textViewAmount.text = prd.pPrice.times(prd.pUnit).toString()
})
}
}
}
I think you can do it using interface.
First you create interface definition (in a separate file or in adapter).
-- for eg: interface ItemChangeListener { fun onItemPriceChange(pass itemprice or totalprice) }
next you create an object of listener inside adapter
Like lateinit var listener: ItemChangeListener inside adapter (set using fun setListener(listener:ItemChangeListener){ // code } ).
Let the main activity implement the interface.
pass the mainActivity this to the adapter.setListener
on Clicking the button, you can call listener.onItemPriceChange(pass itemprice or totalprice)
you can get the parameter on main activity in this way.
Check this link for some details.. Same can be done using constructor parameter I guess.