我在做问卷调查,它是基于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
函数被调用,但结果是项目根本没有被启用。
看起来像你重新创建适配器行 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支持。