简体   繁体   中英

Data Binding inflate layout inside another layout

im trying to make a base bottom sheet dialog fragment class that supports data binding. here is my class:

abstract class RoundedBottomSheetDialogFragment<VM : BaseViewModel, DB : ViewDataBinding> :
    BottomSheetDialogFragment() {

    abstract val viewModel: VM
    open lateinit var binding: DB

    private fun init(inflater: LayoutInflater, container: ViewGroup?) {
        binding = DataBindingUtil.inflate(inflater, getLayoutRes(), container, true)
    }

    abstract fun getLayoutRes(): Int

    abstract fun configEvents()

    abstract fun bindObservables()

    /**
     *
     *  You need override this method.
     *  And you need to set viewModel to binding: binding.viewModel = viewModel
     *
     */
    abstract fun initBinding()

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val parentLayout = inflater.inflate(R.layout.rounded_bottom_sheet, container, false)
        init(inflater, parentLayout.container)
        showDialogAsExpanded()
        return parentLayout
    }

    private fun showDialogAsExpanded() {
        dialog?.setOnShowListener {
            val bottomSheetInternal =
                (dialog as BottomSheetDialog).findViewById<View>(R.id.design_bottom_sheet) ?: return@setOnShowListener
            val behavior = BottomSheetBehavior.from(bottomSheetInternal)
            behavior.state = BottomSheetBehavior.STATE_EXPANDED
            behavior.skipCollapsed = true
        }
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        configEvents()
        bindObservables()
    }
}

if you see i'm inflating a layout inside this dialog fragment class and i want to use data binding inside that layout xml file. this is an example of my xml file:

<layout>
    <data>
        <variable
            name="vm"
            type="com.mobtakerteam.walleto.ui.login.searchcountry.SearchCountryViewModel" />

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">


        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/search_list"
            android:layout_width="match_parent"
            android:layout_height="400dp"
            app:data="@{vm.countries}"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
            tools:itemCount="20"
            tools:listitem="@layout/fragment_search_country_row" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

but the problem is that it is not working in the xml layout and i have to manually observe the live data objects inside kotlin class like this:

viewModel.countries.observe(this, Observer {
        adapter.submitList(it)
    })

so what is the problem?

使用带绑定的LiveData ,您必须设置生命周期所有者,如此binding.lifecycleOwner = this

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM