簡體   English   中英

由於變量值 kotlin,如何更新 recyclerView 列表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM