Android - Привязка данных с LiveData содержит старые значения - PullRequest
1 голос
/ 23 апреля 2020

У меня есть набор привязки данных, и я использую адаптер привязки ViewPager для переключения между экранами:

BindingAdapter

@BindingAdapter("app:nextPageListener") fun nextPageListener(viewPager: ViewPager, next: Boolean?) {
  next ?: return
  if (next) viewPager.nextPage()
  else viewPager.previousPage()
} 

View Pager

<ViewPager
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:nextPageListener="@{viewModel.nextPageListener}"
    />

viewModel.nextPageListener

  private val _nextPageListener = MutableLiveData<Boolean>()
  val nextPageListener: LiveData<Boolean> get() = _nextPageListener

Моя проблема в том, что я вызываю _nextPageListener.postValue(true) и go на следующую страницу и в какой-то момент покидаю экран, когда я возвращаюсь, BindingAdapter автоматически вызывается с true что делает пейджер go на следующую страницу. так что в основном во все последующие моменты времени пейджер открывается на втором экране.

Не уверен, имеет ли это какое-либо отношение к жизненному циклу, но если это помогает, это то, что у меня есть

binding.lifecycleOwner = viewLifecycleOwner

Любая идея, как это исправить без каких-либо уродливых обходных путей?

1 Ответ

1 голос
/ 23 апреля 2020

Да. Вы можете использовать Event класс.

open class Event<out T>(private val content: T) {

    var hasBeenHandled = false
        private set // Allow external read but not write

    /**
     * Returns the content and prevents its use again.
     */
    fun getContentIfNotHandled(): T? {
        return if (hasBeenHandled) {
            null
        } else {
            hasBeenHandled = true
            content
        }
    }

    /**
     * Returns the content, even if it's already been handled.
     */
    fun peekContent(): T = content
}

Теперь вы можете обернуть LiveData вот так.

   private val _nextPageListener = MutableLiveData<Event<Boolean>>()
val nextPageListener: LiveData<Event<Boolean>> get() = _nextPageListener

и последний шаг в вашей деятельности.

yourVm.nextPageListener.observe(this, Observer {
            it.getContentIfNotHandled()?.let {
                when (it) {

                  //get Your value here.
                }
            }
        })
...