我有一个项目,必须在自定义布局中构建视图。此布局表示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)
}
答案 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中进行设置。