Есть ли чистый DRY способ обновления нескольких текстовых элементов из HTTP-запроса JSON?

У меня есть следующие действия Kotlin / Anko / Android.

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 } } } } 

Для яростной питонисты, такой как я, это кажется ужасно статическим и многословным способом сделать это.

Есть ли способ лучше?

Поскольку есть только TextView и вам нужно только изменить их текст, вы можете упростить свой код следующим образом:

  • Добавьте отображение свойств Order сохраняющих идентификаторы:

     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) } 

Вы можете пойти еще дальше и избавиться от идентификаторов и findViewById<TextView>(...) если вы сохраните TextView возвращенные textView { ... } вместо идентификаторов на карте, но это требует дальнейшего эксперимента ,

Если вам не нужно часто обновлять новые данные, вам не нужно сохранять ссылки на TextView . Я не использую Anko, но он может выглядеть так:

 val order: Order = JSON.readValue(json!!) verticalLayout { arrayOf(order.customer, order.address, order.postal_code, order.phone) .map { textView { text = it } } } 
Intereting Posts
Ни один из подписчиков RxJava onNext / onError / onComplete не вызывается при цепочке. Наблюдения, созданные из Observable.create () Конфигурация Kotlin для нескольких ароматов recyclerView с Kotlin в новом классе Недвижимость в интерфейсе не может иметь поле подкладочный Преобразование байт-массива в строку в Kotlin Kotlin – Это отличный способ бросить NotImplementedError для всех методов класса? Android Kotlin Dagger2 предоставляет gson: Параметр, указанный как непустой, равен null Инкапсулирование получения имени метода в вспомогательном методе Цепочка опций вместо if / else Каков правильный способ использования сравнения «больше чем», «меньше» по сравнению с целыми числами с нулевым значением в Котлине? Ошибка: (2, 0) Не удалось найти метод 'org.gradle.api.internal.file.DefaultSourceDirectorySet Как обновить элемент в ArrayList без знания индекса в Android с базой данных Firebase Realtime? Как добавить поддержку градиента для проекта TestNG Kotlin? retryWhen () не вызывает то, что находится внутри Observable.just () Android BroadcastReceiver onReceived никогда не звонил на устройство Android 7