2017-02-15 65 views
1

我有以下Kotlin/Anko/Android活動。是否有乾淨的DRY方式來從HTTP請求JSON更新多個textViews?

import android.os.Bundle 
import android.support.v7.app.AppCompatActivity 
import android.widget.TextView 
import com.fasterxml.jackson.module.kotlin.readValue 
import com.github.kittinunf.fuel.Fuel 
import eu.gwapi.laaketilaus.util.JSON 
import eu.gwapi.laaketilaus.util.Order 
import org.jetbrains.anko.find 
import org.jetbrains.anko.textView 
import org.jetbrains.anko.toast 
import org.jetbrains.anko.verticalLayout 

class OrderDetailsActivity : AppCompatActivity() { 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     val order_id: Long = intent.extras.getLong("order_id") 
     verticalLayout { 
      textView { 
       id = R.id.order_detail_customer 
      } 
      textView { 
       id = R.id.order_detail_address 
      } 
      textView { 
       id = R.id.order_detail_postal_code 
      } 
      textView { 
       id = R.id.order_detail_phone 
      } 
     } 
     getOrder(order_id) 
    } 

    fun getOrder(order_id: Long) { 
     Fuel.get("https://my.api.endpoint/" + order_id.toString()).responseString { request, response, result -> 
      val (json, err) = result 
      if (err != null) { 
       toast(err.toString()) 
      } else { 
       val order: Order = JSON.readValue(json!!) 
       find<TextView>(R.id.order_detail_customer).text = order.customer 
       find<TextView>(R.id.order_detail_address).text = order.address 
       find<TextView>(R.id.order_detail_postal_code).text = order.postal_code 
       find<TextView>(R.id.order_detail_phone).text = order.phone 
      } 
     } 
    } 
} 

對於像我這樣頑固的pythonista,這似乎很靜態和冗長的做法。

有沒有更好的方法?

回答

1

由於只有TextView S和你只需要改變自己的文字,您可以簡化代碼通過以下方式:

  • 添加映射爲Order性存儲的ID:

    private val orderPropertyToTextViewId = mapOf(
         Order::customer to R.id.order_detail_customer, 
         Order::address to R.id.order_detail_address, 
         Order::postalCode to R.id.order_detail_postal_code, 
         Order::phone to R.id.order_detail_phone 
    ) 
    
  • 創建迭代地圖上的觀點:

    verticalLayout { 
        for ((property, textViewId) in orderPropertyToTextViewId) { 
         textView { id = textViewId } 
        } 
    } 
    
  • 更新文本迭代的地圖上:

    for ((property, textViewId) in orderPropertyToTextViewId) { 
        findViewById<TextView>(textViewId).text = property.get(order) 
    } 
    

你可以更進一步,擺脫了ID和findViewById<TextView>(...)的,如果你存儲TextView s數textView { ... }調用,而不是在標識返回地圖,但這需要進一步的實驗。

+0

'orderPropertyToTextViewId.forEach {屬性,textViewId - > ...}'比依賴於'for'更多的功能(地道)代碼循環 –

1

如果您不需要經常刷新新數據,則不需要保留對TextView的引用。我不使用安口,但它可能看起來像:

val order: Order = JSON.readValue(json!!) 
verticalLayout { 
    arrayOf(order.customer, order.address, order.postal_code, order.phone) 
      .map { 
       textView { 
        text = it 
       } 
      } 
} 
相關問題