Привязка данных раздувает макет внутри другого макета - PullRequest
0 голосов
/ 24 июня 2019

я пытаюсь создать базовый класс фрагмента диалога нижнего листа, который поддерживает привязку данных.Вот мой класс:

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()
    }
}

, если вы видите, что я надуваю макет внутри этого класса фрагмента диалога, и я хочу использовать привязку данных внутри этого XML-файла макета.это пример моего xml-файла:

<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>

, но проблема в том, что он не работает в макете xml, и мне приходится вручную наблюдать живые объекты данных внутри класса kotlin следующим образом:

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

так в чем проблема?

1 Ответ

0 голосов
/ 24 июня 2019

Используя LiveData с привязкой, вы должны установить владельца жизненного цикла следующим образом binding.lifecycleOwner = this

...