Android View не обновляется при привязке данных - PullRequest
0 голосов
/ 15 октября 2019

Я создал простое приложение, которое загружает случайную шутку из API и показывает ее в TextView. В целях обучения я реализовал приложение с привязкой данных. Сначала я создал ViewModel, который извлекает данные из API

class RandomJokeViewModel: ViewModel() {

private val jokeService = RetrofitService()

fun getRandomJoke(): MutableLiveData<RandomJoke> ? {
    Log.e("getRandomJokeData", "yes")
    return jokeService.loadRandomJoke()
}

В моем фрагменте я вызываю метод для загрузки анекдотов и обновления представления

class RandomJokeFragment : Fragment() {

private lateinit var binding: FragmentRandomJokeBinding

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    binding = DataBindingUtil.inflate(layoutInflater, R.layout.fragment_random_joke, container, false)
    binding.lifecycleOwner = this
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_random_joke, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    loadRandomJoke()
}

private fun loadRandomJoke() {
    Log.e("getAndroidVersion", "yes")
    val randomJokeViewModel =
        ViewModelProviders.of(requireActivity()).get(RandomJokeViewModel::class.java)
    randomJokeViewModel.getRandomJoke()?.observe(this, Observer<RandomJoke> { randomJoke ->
        binding.randomJoke = randomJoke
        Log.e("RandomJokeFragment", "This is your Joke: ${randomJoke.value}")
    })
}

Мои вызовы данных выглядяткак это:

data class RandomJoke (
@SerializedName("categories") val categories: ArrayList<String>,
@SerializedName("created_at") val createdAt: String,
@SerializedName("icon_url") val iconUrl: String,
@SerializedName("id") val id: String,
@SerializedName("updated_at:") val updatedAt: String,
@SerializedName("url") val url: String,
@SerializedName("value") val value: String)

В моем макете фрагмента я определил ресурсы привязки данных следующим образом:

<data>
    <variable
        name="randomJoke" type="com.example.jokegenerator.data.remote.response.RandomJoke"
        />
</data>

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorPrimaryDark"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="1dp"
        android:layout_marginStart="1dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:text="@{randomJoke.value}"
        android:textColor="#ffff"
        tools:text="Hello World"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Поэтому, когда я запускаюприложение мой TextView пусто. В Logcat и Debugger я проверял, что ответ randomJoke содержит данные. Почему мое представление не обновляется после получения данных? Что я пропустил?

Ответы [ 2 ]

3 голосов
/ 15 октября 2019

Не совсем уверен, что это причина, но:

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    binding = DataBindingUtil.inflate(layoutInflater, R.layout.fragment_random_joke, container, false)
    binding.lifecycleOwner = this
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_random_joke, container, false)
}

здесь вы раздуваете свой макет 2 раза.

вместо этого попробуйте так:

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // This will inflate your layout. You just have to return the root view.
    binding = DataBindingUtil.inflate(layoutInflater, R.layout.fragment_random_joke, container, false)
    binding.lifecycleOwner = this
    return binding.root // Returning your root view
}

Привязка данных - это, вероятно, смешение двух макетов.

2 голосов
/ 15 октября 2019

В вашем onCreateView () вы возвращаете:

return inflater.inflate(R.layout.fragment_random_joke, container, false)

, но вам нужно вернуть:

return binding.root
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...