如果 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&lt;List&lt;Entry&gt;&gt;

这是我提到的所有要点的一种可能实现:

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 的可见性? (安卓/科特林)的主要内容,如果未能解决你的问题,请参考以下文章

如果字段为空,则 Jooq fetchInto 具有默认值

如何将 Kotlin 的 MutableList 初始化为空 MutableList?

如何在kotlin中获取mutableList的mutableList?

Python PyQt5:如果 QLineEdit 为空,如何更改 QLabel 的颜色?

如何通过 kotlin 中的意图传递对象的 MutableList

如何将字符串从共享首选项转换为 MutableList<LatLng> 对以在 kotlin 中绘制折线?