Привязка данных с LiveData

Я новичок в компонентах архитектуры и привязке данных. Я пытаюсь обновить свое поле Textview в макете, как только получу ответ от API. Теперь мой окончательный ответ находится в 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))


    })

Я знаю об использовании наблюдаемых полей и делаю это. Я также знаю, что это также можно сделать, если я передам это свойство новой переменной и назначу ее в файле макета, но я хочу понять, как лучше всего это сделать.

Я пытался следить за многими блогами и несколькими вопросами, доступными здесь, но ни один из них не помогает с лучшим способом сделать это.

Просьба ко всем присутствующим просветить путь. Заранее спасибо.


person Harry Sharma    schedule 27.06.2019    source источник
comment
Вам нужны адаптеры привязки.   -  person Sanlok Lee    schedule 27.06.2019


Ответы (1)


Ну, вы можете сделать это многими способами. Вы можете преобразовать свои livedata в требуемый тип данных: В вашей модели представления: val newData=Transformations.map(finalSet){it.model.data}

Здесь вы получаете свой финальный набор и получаете конкретные данные из ваших данных finalSet, которые содержат объект модели.

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

Он будет запущен, когда ваш finalSet будет иметь действительные данные

person p.mathew13    schedule 27.06.2019
comment
Как упоминалось здесь, stackoverflow .com/questions/52746799/ это не лучший способ сделать это. - person Harry Sharma; 27.06.2019
comment
Кроме того, мои LiveData не относятся к типу данных, а являются моделью. - person Harry Sharma; 27.06.2019
comment
Обновил ответ. Пожалуйста, проверьте и скажите мне, если у вас есть какие-либо сомнения @HarrySharma - person p.mathew13; 27.06.2019
comment
Это тот же ответ, упомянутый в ссылке, упомянутой мной :) - person Harry Sharma; 27.06.2019
comment
Это один из способов. Разные люди делают одни и те же вещи по-разному - person p.mathew13; 27.06.2019
comment
Я знаю братан. Просто проверяю, как лучше всего это сделать :) - person Harry Sharma; 27.06.2019
comment
Проверьте образцы кода Google в их репозитории github. Почти уверен, что это будет лучший способ найти - person p.mathew13; 27.06.2019