You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过BindingAdapter结合ViewModel函数返回值切换视图可见性

问题修复:BindingAdapter无法根据ViewModel函数切换视图可见性

核心问题点

  1. 绑定表达式名称不匹配 + 函数调用语法错误
    布局中写的viewModel.lastDutyDay和ViewModel里的isLastDutyDay()名称不一致,且Data Binding调用函数必须加括号。
  2. Fragment未将ViewModel实例绑定到布局变量
    布局声明了viewModel变量,但Fragment没有把创建好的ViewModel实例赋值给它,导致布局无法获取数据。

分步修复

1. 修正布局中的绑定表达式

修改custom_row.xml里的app:visibleGone属性:

<LinearLayout
    android:id="@+id/footer_layout"
    android:layout_width="match_parent"
    android:background="@color/md_theme_light_surfaceTint"
    app:visibleGone="@{viewModel.isLastDutyDay()}"
    android:orientation="vertical">

2. 在Fragment中绑定ViewModel到布局

修改ListFragment.kt的onCreateView方法,添加ViewModel赋值代码:

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View {

    setHasOptionsMenu(true)

    _binding = FragmentListBinding.inflate(inflater, container, false)
    _binding?.lifecycleOwner = viewLifecycleOwner
    // 新增:将ViewModel实例绑定到布局变量
    _binding?.viewModel = viewModel
    return binding.root
}

(可选)支持动态更新可见性

如果后续需要根据数据变化动态切换可见性,建议把ViewModel中的函数改成LiveData:

// ViewModel.kt
val isLastDutyDay = MutableLiveData(true)

对应的布局绑定表达式改成(不需要括号,Data Binding会自动观察LiveData变化):

app:visibleGone="@{viewModel.isLastDutyDay}"

额外验证点

确保你的项目已经启用Data Binding:在模块级build.gradle中添加配置:

android {
    ...
    buildFeatures {
        dataBinding true
        // 如果用ViewBinding可以同时开启:viewBinding true
    }
}

内容的提问来源于stack exchange,提问作者Marcel Fuchs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 18:12:27