如何因kotlin变量值而更新recyclerView列表?

问题描述 投票:0回答:1

我在做问卷调查,它是基于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)
        }
    }

然后在onBindViewHolder中尝试启用 items:,最后启用函数。

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 等于选定的答案。但是我的项目不能以这种方式启用 :( 我看到我的函数也没有从foo变量中调用。我做错了什么,如何解决?

更新

itemEnabler 函数被调用,但结果是项目根本没有被启用。

android recycler-adapter
1个回答
0
投票

看起来像你重新创建适配器行 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 领域

data class ListData(val isChecked: Boolean)

之后你可以使用diff-util (https:/developer.android.comreferenceandroidxrecyclerviewwidgetDiffUtil。)来更新屏幕上的所有变化数据。

而你的onBindViewHolder函数也会变得更加简单。

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int){
    holder.itemView.checkbox.isEnabled = data[position].enabled
}

也有一些很好的库,比如Groupie (https:/github.comlisawraygroupie。),减少了RecyclerViews适配器的模板代码,并且已经有DiffUtil支持。

© www.soinside.com 2019 - 2024. All rights reserved.