如何解决ViewModel 中 ObservableInt 的可见性未显示
我有一个带有 Activity
和 View
的基本 ViewModel
。我正在使用数据绑定库。
我需要更新 TextView
中 ViewModel
的可见性。
这是我如何设置我的 Activity
:
class HomeActivity : AppCompatActivity() {
// Helper classes
private var binding : ActivityHomeBinding? = null
private var viewModel = HomeViewModel()
// ...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this,R.layout.activity_home)
binding?.viewModel = viewModel
// ...
viewModel.setNoContact()
}
// ...
}
这是我的 HomeViewModel
的样子:
class HomeViewModel {
val contactsListVisibility = ObservableInt(View.VISIBLE)
val loadingVisibility = ObservableInt(View.VISIBLE)
val noContactVisibility = ObservableInt(View.VISIBLE)
// ...
fun setNoContact() {
Log.d(TAG,"Current no contacts visibility = ${noContactVisibility.get()}")
contactsListVisibility.set(View.GONE)
loadingVisibility.set(View.GONE)
noContactVisibility.set(View.VISIBLE)
Log.d(TAG,"Should set no contacts visibility to ${noContactVisibility.get()}")
}
companion object {
private const val TAG = "HomeViewModel"
}
这是我的 View
:
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewModel"
type="com.example.ft_hangouts.home_activity.HomeViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:background="@color/cardview_dark_background"
tools:context=".home_activity.HomeActivity">
<!-- ... -->
<TextView
android:id="@+id/no_contact"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/no_contact"
android:textSize="30sp"
android:visibility="@{viewModel.noContactVisibility}"
android:textColor="@color/white"
style="@style/BasicTextStyle"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!-- ... -->
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
xml 布局中我的 ViewModel
的路径是正确的。链接完成,当我 Ctrl + 单击它时,我被带到我的 HomeViewModel
。
但是,“No Contact”TextView
永远不会出现。
这是我得到的结果:
这是预期的结果:
查看日志时,我有:
D/HomeViewModel: Current no contacts visibility = 8
Should set no contacts visibility to 0
所以没有理由不显示 TextView
。我忘记了什么?
谢谢。
解决方法
我尝试添加虚拟数据来测试这一点。假设您有一个这样的联系人 ArrayList..
val contactList: ArrayList<Int> = arrayListOf()
并且我为联系人添加了虚拟数据,以便您可以测试自己。通常,您会从服务或联系人应用中获取这些数据。
HomeViewModel
fun setDummyContact(isAddYes: Boolean){
if(isAddYes){
contactList.add(7673443334)
contactList.add(2233444512)
contactList.add(1233455623)
}
}
您可以像这样从 HomeActivity
设置数据...
viewModel.setDummyContact(false) // for no contact data
**OR** viewModel.setDummyContact(true) // add contacts -
您只需执行以下操作即可根据您的 contactList 数据处理 TextView
的可见性。
- 将视图的导入添加到您的数据类型
<data>
<import type="android.view.View"/>
<variable
name="viewModel"
type="com.example.ft_hangouts.home_activity.HomeViewModel" />
</data>
然后将此添加到您的 No Contact TextView
android:visibility="@{viewModel.contactList.size() > 0 ? View.GONE : View.VISIBLE}"
因此您不需要添加任何函数或布尔值来处理可见性。它是更干净、更好的解决方案,因为您不需要额外的变量来处理 textView 的可见性。您可以对要显示或隐藏的任何其他视图执行相同操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。