我正在使用兩個片段和一個 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)
}
謝謝你的幫助。
uj5u.com熱心網友回復:
我猜您希望您的觀察者在添加entryInfo到事件串列時收到事件通知( _entryList.value?.add(_entry.value!!)。但這不會發生,因為您只是將元素添加到同一個可變串列中,并且串列參考沒有更改,實時資料不會發出任何更新。
要解決此問題,您有兩種選擇。
- 創建一個新的布爾實時資料,用于控制何時顯示和隱藏資訊文本。將其初始值設定為
false,并將其更新為trueinaddEntry()函式。 - 不是更新相同的可變串列,而是創建它的副本,添加元素并將 entryList.value 設定為等于這個新串列。這樣你的觀察者就會收到新串列的通知。
此外,除非別無選擇,否則公開可變資料通常不是一個好習慣。在這里,您將公開一個可變的 Entry 串列,并且也以可變的實時資料的形式公開。理想情況下,您應該公開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這里沒有使用實時資料,但你可以用同樣的方式實作它。
uj5u.com熱心網友回復:
將您的 viewModel 設定為在添加條目時觀察。
我認為您在 if else 塊中設定了可見性切換錯誤。
if (entryList.isNullOrEmpty()) {
entryListView.instructions_text_view.visibility = View.GONE // OR View.INVISIBLE
} else {
entryListView.instructions_text_view.visibility = View.VISIBLE
}
uj5u.com熱心網友回復:
當 _entryList 發生變化時,您的觀察者應該收到 entryList 變化的通知。確保您正在呼叫 addEntry() 函式來觸發通知。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/327440.html
