【问题标题】:Android Two-way data binding AdapterViewBindingAdapter (ListView)Android 双向数据绑定AdapterViewBindingAdapter(ListView)
【发布时间】:2021-11-01 07:33:57
【问题描述】:

我有一个 ListView 并尝试使用双向数据绑定在 ViewModel 中使用 Two-Way Attributes 设置 selectedItemPosition

但问题是它不起作用,所选项目没有设置在 liveData 的值中,我试图观察它,当我在listView 中选择一个项目时,值永远不会改变

XML 中的数据绑定:

        <ListView
            android:id="@+id/listView"
            android:layout_width="match_parent"
            android:layout_height="@dimen/_150sdp"
            android:nestedScrollingEnabled="true"
            tools:listheader="@tools:sample/lorem"
            tools:visibility="visible"
            android:choiceMode="singleChoice"
            android:selectedItemPosition="@={viewModel.chosenPosition}" />

在 ViewModel 中:

   val chosenPosition = MutableLiveData<Int>()

在片段中:

binding.viewModel = viewModel
binding.lifecycleOwner = viewLifecycleOwner

binding.teamsListView.adapter = ArrayAdapter(
                context,
                R.layout.list_item_choice, teamsNames
            )

viewModel.chosenPosition.observe(viewLifecycleOwner) {
        Timber.d("chosen position = $it") //never triggers when I select an item in the ListView 
    }

【问题讨论】:

  • 如何更改viewModel.chosenPosition
  • 通过在列表视图中选择一个项目,它应该通过数据绑定设置值android:selectedItemPosition="@={viewModel.chosenPosition}"
  • 你是从哪里得到这个属性的?你有 BindingAdapter 吗?

标签: android data-binding android-databinding 2-way-object-databinding


【解决方案1】:

问题:

android:selectedItemPosition 在选择项目时触发(这并不隐含地包括单击/检查项目。

ListView 中使用android:selectedItemPosition 作为双向数据绑定实际上不会在选择项目时自动触发,因此不会触发 LiveData。

可以看到,当你创建一个普通的ListView,没有任何数据绑定;当您单击一个项目时,这不会触发选择,请注意以下当单击一个项目时(没有以不同的颜色突出显示):

解决办法:

为了解决这个问题,为了数据绑定,您需要通过将OnItemClickListener 注册到ListView 来显式选择该项目:

binding.listView.setOnItemClickListener { _, _, position, _ ->
    if (position >= 0) { // avoid -1 position calls
        binding.listview.requestFocusFromTouch()
        binding.listview.setItemChecked(position, true)
        binding.listview.setSelection(position)
    }
}

这样实时数据将被设置到当前选择的位置:

请注意,当一个项目被选中时,它现在以浅灰色突出显示,这是因为启用了选择:

【讨论】:

  • 出于好奇,为什么 ListView 不会自动触发选择?
  • 我认为他们把它留给了开发人员,因为选择会突出显示项目,但并非所有情况下您都想选择/突出显示项目
  • @HussienFahmy 你还在困惑吗?
  • 不用了,非常感谢
【解决方案2】:

确保您没有忘记在片段中设置绑定生命周期所有者

binding.lifecycleOwner = this

【讨论】:

  • 我更新了问题,是的,我设置了它NOTE: All other observes works well
猜你喜欢
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 2019-12-24
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
相关资源
最近更新 更多