如何改变一个TextView的可见性,如果一个MutableList是空的?(Android /芬兰湾的科特林).<



我正在使用两个片段和一个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)
}

谢谢你的帮助。

我猜当您将entryInfo添加到事件列表(_entryList.value?.add(_entry.value!!))时,您希望您的观察者获得事件通知。但这不会发生,因为你只是在同一个可变列表中添加一个元素,并且由于列表引用没有改变,活动数据不会发出任何更新。

要解决这个问题,您有两个选择:

  • 创建一个新的布尔实时数据,它控制何时显示和隐藏信息文本。初始值设置为false,在addEntry()函数中更新为true
  • 不更新同一个可变列表,而是创建它的副本,添加元素并设置entryList。值等于这个新列表。这样你的观察者就会收到新的列表通知。

此外,除非没有其他选择,否则公开可变数据通常不是一个好做法。在这里,您以可变的活动数据的形式公开了一个可变的条目列表。理想情况下,您应该暴露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的实时数据,但是你可以用同样的方式实现它。

设置viewModel为观察添加的条目

我认为你在if else块中设置的可见性开关是错误的。

if (entryList.isNullOrEmpty()) {
entryListView.instructions_text_view.visibility = View.GONE // OR View.INVISIBLE
} else {
entryListView.instructions_text_view.visibility = View.VISIBLE
}

当_entryList发生变化时,你的Observer应该得到entryList变化的通知。请确保您正在调用addEntry()函数来触发通知。

相关内容

  • 没有找到相关文章

最新更新