【问题标题】:Data binding with LiveData与 LiveData 的数据绑定
【发布时间】:2019-06-27 11:02:49
【问题描述】:

我是体系结构组件和数据绑定的新手,一旦我得到 API 的响应,我正在尝试更新布局中的 Textview 字段。现在我的最终回复是这样的 Livedata:

  public class LoginViewModel @Inject constructor(var mApplication: Application, var repository: LoginRepository) :
ViewModel() {


var username: MutableLiveData<String> = MutableLiveData<String>()
var password: MutableLiveData<String> = MutableLiveData<String>()
var finalSet: MediatorLiveData<WeatherData> = MediatorLiveData()

init {
    username.value = ""
    password.value = ""
    finalSet.addSource(repository.dataList) { it ->

        finalSet.postValue(it)
    }
}

    fun getWeatherData(): MediatorLiveData<WeatherData> {




        return finalSet
    }

这是我的布局文件

    <data>

    <variable
        name="loginViewModel"
        type="check.test.com.myapplication.login.LoginViewModel" />
    />


</data>
         <TextView
             android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{loginViewModel.}" />

这是我的数据类

      class WeatherData {


@SerializedName("coord")
var coord: Coord? = null
@SerializedName("sys")
var sys: Sys? = null
@SerializedName("weather")
var weather = ArrayList<Weather>()
@SerializedName("main")
var main: Main? = null
@SerializedName("wind")
var wind: Wind? = null
@SerializedName("rain")
var rain: Rain? = null
@SerializedName("clouds")
var clouds: Clouds? = null
@SerializedName("dt")
var dt: Float = 0.toFloat()
@SerializedName("id")
var id: Int = 0
@SerializedName("name")
var name: String? = null
@SerializedName("cod")
var cod: Float = 0.toFloat()
  }

  class Weather {
@SerializedName("id")
var id: Int = 0
@SerializedName("main")
var main: String? = null
@SerializedName("description")
var description: String? = null
@SerializedName("icon")
var icon: String? = null
 }

class Clouds {
@SerializedName("all")
var all: Float = 0.toFloat()
  }

  class Rain {
@SerializedName("3h")
var h3: Float = 0.toFloat()
 }

  class Wind {
@SerializedName("speed")
var speed: Float = 0.toFloat()
@SerializedName("deg")
var deg: Float = 0.toFloat()
}

class Main {
@SerializedName("temp")
var temp: Float = 0.toFloat()
@SerializedName("humidity")
var humidity: Float = 0.toFloat()
@SerializedName("pressure")
var pressure: Float = 0.toFloat()
@SerializedName("temp_min")
var temp_min: Float = 0.toFloat()
@SerializedName("temp_max")
var temp_max: Float = 0.toFloat()
 }

 class Sys {
@SerializedName("country")
var country: String? = null
@SerializedName("sunrise")
var sunrise: Long = 0
@SerializedName("sunset")
var sunset: Long = 0
 }

 class Coord {
@SerializedName("lon")
var lon: Float = 0.toFloat()
@SerializedName("lat")
var lat: Float = 0.toFloat()
 }

现在我想要的是,一旦我拥有 finalSet 变量中的数据,应该更新 Textview 文本。

我想过这样做:

         <data>

    <variable
        name="loginViewModel"
        type="check.test.com.myapplication.login.LoginViewModel" />
    />

    <variable
        name="data"
        type="check.test.com.myapplication.login.WeatherData" />
    />


</data>

并像这样在活动观察者中为数据元素赋予价值

    viewModel.getWeatherData().observe(this, Observer { data ->


        binding.data = data

       // startActivity(Intent(this, MainActivity::class.java))


    })

我知道使用可观察字段并这样做。我也知道,如果我将此属性传递给一个新变量并将其分配到布局文件中,也可以做到这一点,但我想了解执行此操作的最佳实践。

我已尝试关注许多博客和一些可用的问题,但它们都没有帮助找到最好的方法。

请在座的各位开导道。提前致谢。

【问题讨论】:

标签: android mvvm data-binding android-livedata


【解决方案1】:

嗯,你可以通过多种方式做到这一点。 您可以将 livedata 转换为所需的数据类型: 在您的视图模型中: val newData=Transformations.map(finalSet){it.model.data}

在这里,您正在获取最终集并从包含模型对象的最终集数据中获取特定数据

<TextView
         android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{loginViewModel.newData}" />

当你的 finalSet 有有效数据时会触发

【讨论】:

  • 正如这里提到的stackoverflow.com/questions/52746799/… 这不是最好的方法。
  • 另外,我的 LiveData 不是数据类型,而是模型。
  • 更新了答案。如果您有任何疑问,请检查并告诉我@HarrySharma
  • 这与我提到的链接中提到的答案相同:)
  • 这是一种做法。不同的人做同样的事情不同
猜你喜欢
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2020-07-22
相关资源
最近更新 更多