自定义视图不会在片段内更新

时间:2019-08-28 09:54:55

标签: android android-fragments kotlin view

我有一个项目,必须在自定义布局中构建视图。此布局表示MVP体系结构中 View 的概念,它位于Fragment中。演示者应在事件发生时通过调用 View 更新视图,最后,该视图将在 View 中更新TextViews。但是似乎在View初始化之后,什么都没有更新了。

如果我的演示者调用了包含我的TextView视图-什么都没有。如果我尝试直接从该片段更新TextView,那么它将起作用。我真的不明白发生了什么,为什么在包含TextView的布局中没有更新它。

MyCustomView:

class MyCustomView(fragment: MyFragment): MyViewInterface, FrameLayout(fragment.context) {

    init {
        View.inflate(context, R.layout.my_fancy_layout, this)
    }

    override fun getView(): View {
        return this
    }

    override fun setData(uiModel: UiModel) {
        textview_name.text = uiModel.name
    }
}

MyFragment:

class MyFragment : Fragment() {

    @Inject lateinit var view: MyViewInterface
    @Inject lateinit var presenter: MyCustomPresenter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ... dagger injection ...
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return this.view.getView()
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        presenter.setData(...some ID to fetch data from API...)
        //textview_name.text = "blue" //this works instead
    }
}

MyPresenter:

class MyPresenter @Inject constructor(
        private val repo: MyRepository,
        private val view: MyViewInterface
) {

    fun setData(productCode: String) {
        .. some code ...
        view.setData(it) //call to my view          
    }
}

MyViewInterface:

interface MyViewInterface {
    fun getView(): View

    fun setData(uiModel: UiModel)
}

2 个答案:

答案 0 :(得分:1)

因为您只是在创建视图时膨胀

    init {
        View.inflate(context, R.layout.my_fancy_layout, this)
    }

在更新数据功能中添加无效视图

  override fun setData(uiModel: UiModel) {
        textview_name.text = uiModel.name
         this.invalidate()
         this.requestLayout()

    }

答案 1 :(得分:1)

我能想到的是,视图的实例在您的UI和演示者中是不同的。我不知道您的Dagger代码,因此没有任何修复建议。

您可以将视图从MyPresenter的构造函数中移开,并在注入后在MyFragment.onCreate中进行设置。