android - 与 LiveData 的数据绑定
问题描述
我是架构组件和数据绑定的新手,一旦我得到 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))
})
我知道使用可观察字段并这样做。我也知道,如果我将此属性传递给一个新变量并将其分配到布局文件中,也可以这样做,但我想了解执行此操作的最佳实践。
我已经尝试关注许多博客和几个可用的问题,但没有一个可以帮助最好的方法。
在此请大家指教。提前致谢。
解决方案
好吧,你可以通过很多方式做到这一点。您可以将 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 具有有效数据时,它将被触发
推荐阅读
- python - 根据条件获取日期间隔之间的重叠持续时间
- socket.io - 我们可以连接到使用flask socketio发出的同一个房间的多个客户端/连接吗?
- testing - Bitbucket 管道您的系统缺少依赖项:Xvfb
- reactjs - Spring Boot - React 无法授权过滤器调用
- twig - 按照管理员中的顺序对选定的联系人进行排序
- java - 如何使用 Swagger CodeGen 共享 Java 枚举
- python - 在 Python 中围绕函数“包装”数据库的打开和关闭的好方法?
- python - 背景图像未出现在 tkinter 中
- javascript - 在数组中查找数组的有效方法是什么?
- java - Java OOP无法将特定元素从arraylist添加到另一个arraylist