[英]How to update recyclerView list due to variable value kotlin?
我正在做基於帶有自己適配器的 RV 的問卷調查。 我的答案發送到服務器 api。 當我收到 200 響應時,我想在列表中啟用答案選項。 所以我在適配器中添加了觀察變量:
var foo: Boolean by Delegates.observable(false) { property, oldValue, newValue ->
if (newValue){
Handler().postDelayed({
notifyItemChanged(0,9)
}, 1000)
}
}
並在我從服務器收到 200 時更改它:
AnswersAdapter().foo = true
然后在 onBindViewHolder 我嘗試啟用項目:
override fun onBindViewHolder(holder: AnswerHolder, position: Int, payloads: MutableList<Any>) {
if (payloads.isNotEmpty()) {
when (payloads[0]) {
...
9 -> {
itemEnabler(Constants.ENABLE_CHECKBOX_ITEM)
}
}
} else {
super.onBindViewHolder(holder, position, payloads)
}
}
最后是 function 用於啟用:
fun itemEnabler(type: Int) {
when (type) {
Constants.ENABLE_CHECKBOX_ITEM -> {
for (i in 0 until itemCount) {
if (i != checkedPosition) {
Timber.i("=--==-=-=-=-")
notifyItemChanged(i, Constants.ENABLE_CHECKBOX_ITEM)
}
}
}
....
}
}
其中checkedPosition
等於選擇的答案。 但是我的項目不能以這種方式啟用:(我看到我的 function 也沒有從 foo 變量中調用。我做錯了什么以及如何解決它?
itemEnabler
function 被調用,但項目因此根本沒有啟用
看起來您在AnswersAdapter().foo = true
行中重新創建了適配器您應該使用類似以下代碼的內容:
class Fragment {
private val answersAdapter = AnswersAdapter()
override fun onCreate(savedInstanceState: Bundle?) {
recycler.adapter = answersAdapter
}
// When server return 200
fun onSuccess() {
answersAdapter.foo = true // Reuse already created adapter
}
}
替代解決方案是使用enabled
字段的 model
data class ListData(val isChecked: Boolean)
在此之后,您可以使用 diff-util ( https://developer.android.com/reference/androidx/recyclerview/widget/DiffUtil ) 在屏幕上更新所有更改的數據。
你的 onBindViewHolder function 會簡單得多:
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int){
holder.itemView.checkbox.isEnabled = data[position].enabled
}
還有像 Groupie ( https://github.com/lisawray/groupie )這樣的優秀庫可以減少 RecyclerViews 適配器樣板代碼,並且已經在底層提供了 DiffUtil 支持。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.