簡體   English   中英

自定義視圖不會在片段內更新

[英]Custom view doesn't update inside a Fragment

我有一個項目,必須在自定義布局中構建視圖。 此布局表示MVP架構中View的概念,它位於Fragment中。 每當事件發生時,演示者都應通過調用View來更新視圖 ,最后將更新View內的TextViews 但是似乎在View初始化之后,沒有任何更新。

如果我的演示者調用了包含我的TextViewViewTextView任何操作。 如果我嘗試直接從片段更新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)
}

因為你只是在創建視圖時膨脹

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

在更新數據功能中添加無效視圖

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

    }

我能想到的是,視圖的實例在您的UI和演示者中是不同的。 我不知道您的Dagger代碼,因此我沒有任何修復建議。

您可以將視圖從MyPresenter的構造函數中移開,並在注入后在MyFragment.onCreate中進行設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM