2017-11-30 23 views
2

Ich habe einen Wert in der Benutzeroberfläche, die ihren Wert von zwei LiveData Objekte abhängt. Stellen Sie sich einen Laden vor, in dem Sie eine subtotal = sum of all items price und eine total = subtotal + shipment price benötigen. Mit Transformations wir folgende für die Zwischensumme Livedata-Objekt tun können (wie es hängt nur von itemsLiveData):LiveData Transformationen.map() mit mehreren Argumenten

val itemsLiveData: LiveData<List<Items>> = ... 
val subtotalLiveData = Transformations.map(itemsLiveData) { 
    items -> 
     getSubtotalPrice(items) 
} 

Im Fall der Gesamt wäre es toll, die Lage sein, so etwas zu tun:

val shipPriceLiveData: LiveData<Int> = ... 
val totalLiveData = Transformations.map(itemsLiveData, shipPriceLiveData) { 
    items, price -> 
     getSubtotalPrice(items) + price 
} 

Aber leider ist das nicht möglich, weil wir nicht mehr als ein Argument in die Kartenfunktion einfügen können. Weiß jemand einen guten Weg, dies zu erreichen?

Antwort

3

Am Ende habe ich MediatorLiveData verwendet, um das gleiche Ziel zu erreichen.

fun mapBasketTotal(source1: LiveData<List<Item>>, source2: LiveData<ShipPrice>): LiveData<String> { 
    val result = MediatorLiveData<String>() 
    uiThread { 
     var subtotal: Int = 0 
     var shipPrice: Int = 0 
     fun sumAndFormat(){ result.value = format(subtotal + shipPrice)} 
     result.addSource(source1, { items -> 
      if (items != null) { 
       subtotal = getSubtotalPrice(items) 
       sumAndFormat() 
      } 
     }) 
     result.addSource(source2, { price -> 
      if (price != null) { 
       shipPrice = price 
       sumAndFormat() 
      } 
     }) 
    } 
    return result 
} 
Verwandte Themen