首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在启用视图状态保存时正确初始化Epoxy ModelView中的属性?

如何在启用视图状态保存时正确初始化Epoxy ModelView中的属性?
EN

Stack Overflow用户
提问于 2019-01-11 16:06:08
回答 1查看 1.4K关注 0票数 0

我为模型视图编写了以下代码。

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

我将日志放在this.checkbox?.isChecked = isChecked之前和之后,我看到传递的值是正确的,并且checkbox isChecked属性设置正确。我不明白的是,为什么环氧会覆盖所有这些,并将checkbox设置为未选中状态(设置为false),而其属性设置为,例如,选中状态。我试着在模型建立后立即在环氧视图上做一个requestModelBuild,并有一些延迟,但它没有帮助。

代码语言:javascript
复制
@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时是否也会出现此问题?为什么复选框标签被正确填充(没有空文本,传递的文本按其应有的方式显示)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-25 11:40:21

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

为了让它起作用,我必须改变

代码语言:javascript
复制
@ModelView(saveViewState = true)
class RowView: ConstraintLayout {

代码语言:javascript
复制
@ModelView
class RowView: ConstraintLayout {

并像这样实现模型重建

代码语言:javascript
复制
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)
    }
}

测试过了,它起作用了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54142546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档