2017-11-30 103 views
2

UIの値は2つのLiveDataオブジェクトに依存します。 subtotal = sum of all items pricetotal = subtotal + shipment priceが必要なショップを想像してみてください。このような何かを行うことができるように素晴らしいことだトータルの場合複数の引数を持つLiveData Transformations.map()

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

Transformationsを用いて、我々は、小計LiveDataオブジェクト(それが唯一の itemsLiveDataに依存する)のために次の操作を行うことができます
val shipPriceLiveData: LiveData<Int> = ... 
val totalLiveData = Transformations.map(itemsLiveData, shipPriceLiveData) { 
    items, price -> 
     getSubtotalPrice(items) + price 
} 

しかし、残念ながらmap関数に複数の引数を指定することはできません。誰でもこれを達成する良い方法を知っていますか?

答えて

3

最後に、同じ目的を達成するためにMediatorLiveDataを使用しました。

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 
} 
関連する問題