NiceToMytyuk
NiceToMytyuk

Reputation: 4277

How to update object value in MutableList?

I have a MutableList in my Android project where i'm adding an object called Articolo, then when a new item is added to that list i need to check if one item with same ID exist and if it does i need to update it's quantity.

The issue is that i'm trying to use MutableList.find to find the object with the same ID and when i find it i'm simply add the quantity to existing quantity but instead it remains immutable.

Here is my Articolo.kt

data class Articolo(var barcode: String, var qta: Int) {
    constructor() : this ("", 0)
}

And here is my function where i'm adding data to MutableList

private var articoli = mutableListOf<Articolo>()
private fun addBarcode(barcode: String, qta: Int) {
    if (barcode.isEmpty()) {
        txtBarcode.requestFocus()
        return;
    }

    articoli.find{
        it.barcode == barcode
    }?.qta?.plus(qta) ?:
        articoli.add(Articolo(barcode, qta))


}

So if i add the first object like barcode: 1111, qty: 1 and then another same object instead of having one element array with qty 2 i still have qty 1..

Upvotes: 0

Views: 1585

Answers (2)

cactustictacs
cactustictacs

Reputation: 19524

@VaiTon86 has the answer (you're not actually changing the value in the Articolo object) but really, you should probably be using a Map here anyway:

  • maximum one of each item
  • lookup by some value (barcode)

that's a map!

There's a few ways you could implement it, here's one:

val articoli = mutableMapOf<String, Articolo>()

private fun addBarcode(barcode: String, qta: Int) {
    articoli.getOrPut(barcode) { Articolo(barcode, 0) }
        .let { it.qta += qta }
}

So the getOrPut just adds a new zero-quantity Articolo entry if there isn't already one, and then you add qta to what's already there for that entry.

Upvotes: 1

VaiTon
VaiTon

Reputation: 371

That's because .plus(Int) returns a new value. You're not changing the property.

Instead you should do:

fun addBarcode(barcode: String, qta: Int) {
    val existant = articoli.find { it.barcode == barcode }
    if (existant != null) existant.qta += qta
    else articoli.add(Articolo(barcode, qta))
}

Upvotes: 5

Related Questions