我想像通过LiveData
一样传递BindingAdapter
。
在BindingAdapter
内,我想做一个Transformations.map
,并显示用户可以选择的不同选项,然后单击时使用相同的LiveData
将结果发送回去。
为了观察LiveData
中的BindingAdapter
,我需要访问LifecycleOwner
,最好是片段视图。如果我想在liveData上调用.observe
或在LifecycleOwner
内部创建的新绑定上设置BindingAdapter
,则需要。
知道我该怎么做吗?
答案 0 :(得分:1)
首先,我建议您不要将过多的业务逻辑放入BindingAdapter
中。除了使用活页夹简单地设置样式属性是一种好习惯之外,我个人还看到过在适配器中放置太多逻辑而导致的“意大利面条式代码灾难”。这是一种非常粗略的做法,因为每次侦听绑定的每个元素都会运行代码,每次您的livedata更改时,逻辑就会变得非常忙碌,而且应用性能也会迅速下降。
话虽如此,我不认为您应该将LiveData
传递到绑定中,而应该将Object E
保留在您的实时数据中。这样,您可以:
LifecycleOwner
的片段中,又是建议的观察变化的方法LiveData
和Transformation
实例中
这样,您的适配器仅具有显示结果/结果的逻辑,并且片段正确地处理了所有工作。
ViewModel实现
如果您想按照Google推荐的架构组件更进一步,建议将逻辑放在ViewModel中(应该遵循MVVM模式),并避免完全使用该片段。您需要将LiveData
变量放入viewModel中(例如var itemColor: LiveData<Int> = MutableLiveData<Int>(R.color.colorPrimary)
),并通过xml将其连接到绑定
即
app:showColor="@{viewModel.itemColor}"
并将所有Transformations逻辑放在viewModel的函数中。将值设置为itemColor
会将值直接发送到您的bindingadapter(showColor
),您可以根据需要使用该值,而无需触摸片段或观察变量!
注意:请记住,将片段中的绑定设置为lifecycleOwner:binding.lifecycleOwner = this
,否则适配器将不会监听更改。
我希望这对您有帮助,Panos。