0

我有以下模型视图的代码。

当我禁用saveViewState = true或删除它时,checkbox?.isChecked由环氧树脂适配器正确设置(根据isChecked传递给注释方法的布尔值设置为真或假)。但是,当我启用它(设置saveViewState = true)时,该checkbox?.isChecked值始终设置为 false(至少在我在 UI 中看到的那样,所有复选框都未选中)。

前后放了log this.checkbox?.isChecked = isChecked,看到传递的值是正确的,checkboxisChecked属性设置正确。我不明白的是为什么环氧树脂会覆盖所有这些并将复选框设置为未选中状态(为假),尽管它的属性设置为例如选中状态。我试图requestModelBuild在模型构建后立即对环氧树脂视图进行处理,并且有一些延迟,但这没有帮助。

@ModelView(saveViewState = true)
class RowView: ConstraintLayout {
    constructor(context: Context):
        super(context)
    constructor(context: Context, attributeSet: AttributeSet):
        super(context, attributeSet)
    constructor(context: Context, attributeSet: AttributeSet, styleAttr: Int):
        super(context, attributeSet, styleAttr)

    @TextProp
    fun setText(text: CharSequence) {
        this.checkbox?.text = text
    }

    @ModelProp
    fun setCheckedState(isChecked: Boolean) {
        this.checkbox?.isChecked = isChecked
    }

    @CallbackProp
    fun setOnChangeListener(listener: CompoundButton.OnCheckedChangeListener?) {
        listener?.let { this.checkbox?.setOnCheckedChangeListener(it) }
    }
}

启用视图状态后,如何在环氧树脂模型视图中设置复选框状态?使用 EditText 时是否也会出现此问题?以及为什么正确填充了复选框标签(没有空文本,传递的文本按原样显示)?

4

1 回答 1

1

正如https://github.com/airbnb/epoxy/issues/681中所讨论的,属性状态应该存储在其他地方,并且 onChangeListener 应该在最后请求模型重建。即“您不能同时由保存的状态和模型道具提供数据,因为它们发生冲突,保存的状态会覆盖模型道具设置”。

为此,我必须改变

@ModelView(saveViewState = true)
class RowView: ConstraintLayout {

@ModelView
class RowView: ConstraintLayout {

并像这样实现模型重建

view.rv.buildModelsWith { controller ->
    model.items.forEach { item ->
        RowViewModel_().id(item.id.name)
            .checkedState(model.itemsChosen[item] ?: false)
            .onChangeListener { buttonView, isChecked ->
                if (buttonView.isShown && buttonView.isPressed) {
                    model.itemsChosen[item] = isChecked
                    controller.requestModelBuild()
                }
            }
            .addTo(controller)
    }
}

测试它并且它工作。

于 2019-02-25T03:40:20.513 回答