【问题标题】:How to change visibility of a TextView if a MutableList is empty? (Android/Kotlin)如果 MutableList 为空,如何更改 TextView 的可见性? (安卓/科特林)
【发布时间】: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)
                 }

感谢您的帮助。

【问题讨论】:

    标签: android kotlin android-fragments


    【解决方案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() 函数来触发通知。

        【讨论】:

          猜你喜欢
          • 2021-07-23
          • 2022-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-28
          • 2021-07-21
          • 1970-01-01
          • 2023-02-14
          相关资源
          最近更新 更多