Android-具有LiveData的数据绑定保留旧值

问题描述 投票:1回答:1

我设置了DataBinding,并使用ViewPager BindingAdapter在屏幕之间切换:

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)并转到下一页,并离开屏幕,在某个时候离开屏幕,当我返回BindingAdapter时会自动用true进行调用,这会使寻呼机转到下一页。因此基本上在接下来的所有时间中,都在第二个屏幕上打开寻呼机。

不确定它是否与生命周期有关,但是否有帮助,这正是我所拥有的

binding.lifecycleOwner = viewLifecycleOwner

任何想法,如果没有一些丑陋的解决方法,如何解决此问题?

android mvvm data-binding android-databinding android-livedata
1个回答
0
投票

是。您可以使用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<String>> get() = _nextPageListener

以及活动的最后一步。

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

                  //get Your value here.
                }
            }
        })
© www.soinside.com 2019 - 2024. All rights reserved.