如果 MutableList 为空,如何更改 TextView 的可见性? (安卓/科特林)
Posted
技术标签:
【中文标题】如果 MutableList 为空,如何更改 TextView 的可见性? (安卓/科特林)【英文标题】:How to change visibility of a TextView if a MutableList is empty? (Android/Kotlin) 【发布时间】:2021-12-04 03:00:06 【问题描述】:我正在使用两个片段和一个 ViewModel 开发一个简单的卡路里计数器应用程序。我是初学者,这是对我刚刚为课程创建的应用程序的修改(此应用程序不是家庭作业)。它使用 ViewModel 并有一个收集用户输入的片段和一个将输入显示为 MutableLiveData 的 MutableList 的片段。我希望列表屏幕最初是空的,除了带有说明的 TextView,并且我希望一旦将条目添加到列表中,说明就会消失。我的班主任告诉我在带有列表的片段中使用 if-else 语句来实现这一点,但它不起作用。他没有告诉我具体放在哪里。我尝试了很多不同的地点,但没有一个有效。我没有收到错误 - 只是 TextView 的可见性没有改变。
这是带有列表的 ViewModel 的代码:
val entryList: MutableLiveData<MutableList<Entry>>
get() = _entryList
init
_entry = MutableLiveData<Entry>()
_entryList.value = mutableListOf()
fun addEntry(entryInfo: Entry)
_entry.value = entryInfo
_entryList.value?.add(_entry.value!!)
这是列表片段中观察者的代码:
Observer entryList ->
val entryListView: View = inflater.inflate(R.layout.fragment_entry_list, null, false)
if (entryList.isNullOrEmpty())
entryListView.instructions_text_view.visibility = View.VISIBLE
else
entryListView.instructions_text_view.visibility = View.GONE
entryList.forEach entry ->
val view: View = inflater.inflate(R.layout.entry_list_item, null, false)
view.date_entry_text_view.text = String.format(getString(R.string.date), entry.date)
view.calories_entry_text_view.text =
view.line_divider
binding.entryList.addView(view)
感谢您的帮助。
【问题讨论】:
【参考方案1】:我猜想当您将entryInfo
添加到您的事件列表 (_entryList.value?.add(_entry.value!!)
.
但这不会发生,因为您只是将一个元素添加到同一个可变列表中,并且由于列表引用没有更改,实时数据不会发出任何更新。
要解决这个问题,您有两种选择。
创建一个新的布尔实时数据,用于控制何时显示和隐藏信息文本。将其初始值设置为false
,并在addEntry()
函数中将其更新为true
。
不是更新同一个可变列表,而是创建它的副本,添加元素并将 entryList.value 设置为等于这个新列表。这样,您的观察者就会收到新列表的通知。
此外,除非别无选择,否则公开可变数据通常不是一个好习惯。在这里,您以可变实时数据的形式公开了一个可变的条目列表。理想情况下,您应该公开LiveData<List<Entry>>
。
这是我提到的所有要点的一种可能实现:
private val _entryList = MutableLiveData(listOf<Entry>()) // Create a private mutable live data holding an empty entry list, to avoid the initial null value.
val entryList: LiveData<List<Entry>> = _entryList // Expose an immutable version of _entryList
fun addEntry(entryInfo: Entry)
_entryList.value = entryList.value!! + entryInfo
我没有在这里使用_entry
实时数据,但你可以用同样的方式实现它。
【讨论】:
【参考方案2】:将您的 viewModel 设置为在添加条目时进行观察。
我认为您在 if else 块中设置了可见性切换错误。
if (entryList.isNullOrEmpty())
entryListView.instructions_text_view.visibility = View.GONE // OR View.INVISIBLE
else
entryListView.instructions_text_view.visibility = View.VISIBLE
【讨论】:
【参考方案3】:当 _entryList 发生更改时,您的观察者应该会收到有关 entryList 更改的通知。确保您正在调用 addEntry() 函数来触发通知。
【讨论】:
以上是关于如果 MutableList 为空,如何更改 TextView 的可见性? (安卓/科特林)的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Kotlin 的 MutableList 初始化为空 MutableList?
如何在kotlin中获取mutableList的mutableList?
Python PyQt5:如果 QLineEdit 为空,如何更改 QLabel 的颜色?