[MVVM- Recyclerview内部包含的布局从未初始化

问题描述 投票:0回答:1

我有一个通用列表,需要在我的应用程序的大多数活动/片段中显示。为此,我创建了一个布局并在其中添加了回收站,如下面的代码所示。然后,根据需要将此布局包括在活动/片段中。我正在使用MVVM和android绑定。我的问题是,从来没有调用recyclerview的onCreateViewHolder甚至getItemCount。我的updateList函数成功地从viewmodel中调用,列表中有2个项目,但是notifydatasetchanged完全无效。我做错了什么?这是我的代码。适配器类

class FaqsAdapter : RecyclerView.Adapter<FaqsAdapter.MyViewHolder>() {
    lateinit var binding: FaqItemBinding
    lateinit var listFaqs: List<ModelFaqs>
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val inflater = LayoutInflater.from(parent.context)
        binding = DataBindingUtil.inflate(inflater, R.layout.faq_item, parent, false)
        return MyViewHolder(binding)
    }

    override fun getItemCount(): Int {
        return if (::listFaqs.isInitialized) listFaqs.size else 0
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.bind(listFaqs[position])
    }

    fun updateList(faqs: List<ModelFaqs>) {
        this.listFaqs = faqs //this line executes
        notifyDataSetChanged() // line also executes but does nothing. 
    }

    class MyViewHolder(binding: FaqItemBinding) : RecyclerView.ViewHolder(binding.root) {
        private val mBinding = binding
        fun bind(modelFaqs: ModelFaqs) {
            val viewModel = FaqItemViewModel()
            viewModel.bind(modelFaqs)
            mBinding.mViewModel = viewModel
        }
    }
}

FragMent

class FragLoan : Fragment() {

//
//other code
override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    binding.viewFaqs.rcFaqs.layoutManager = LinearLayoutManager(context)
    viewModel = ViewModelProviders.of(this).get(FragLoanViewModel::class.java)

}

} 

viewModel类

class FragLoanViewModel : BaseViewModel() {
    //other code

    private fun onLoanSuccess(response: AdvanceLoanDetails?) {
        Log.d(TAG, "LoanViewModel--On Success")
        val modelFaqs: MutableList<ModelFaqs> = mutableListOf()
        if (response?.result == true) {
            if (response.resultContent?.faqs != null) {
                for (faqs in response.resultContent.faqs) {
                    val model = ModelFaqs(faqs?.question, faqs?.answer)
                    modelFaqs.add(model)
                }
                updateFaq(modelFaqs)
             }

    }
//other code. 

}

Base ViewModel这是我的baseviewModel

abstract class BaseViewModel : ViewModel() {
    val faqsAdapter = FaqsAdapter()

    private val injector: ViewModelInjector = DaggerViewModelInjector
        .builder()
        .networkModule(NetworkModule)
        .build()

    init {
        inject()
    }

    private fun inject() {
        when (this) {
            //code here

        }

    }

    fun updateFaq(listFaqs: List<ModelFaqs>) {

        faqsAdapter.updateList(listFaqs)
    }
}

片段布局

<layout>

    <data>

        <variable
            name="viewModel"
            type="com.mypackage.viewmodel.FragLoanViewModel" />
    </data>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorViewBackgroundGrey"
    tools:context="com.mypackage.myfragments.FragLoan">
//other code. 
<include
    android:id="@+id/viewFaqs"
    layout="@layout/view_faq"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    app:layout_constraintEnd_toEndOf="@id/guideRight"
    app:layout_constraintStart_toStartOf="@id/guideLeft"
    app:layout_constraintTop_toBottomOf="@+id/cvLoanDetails" />

</ androidx.constraintlayout.widget.ConstraintLayout>

这是我的布局,包含在片段中

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="faqViewModel"
            type="com.mypackage.base.BaseViewModel" />
    </data>

    <androidx.cardview.widget.CardView
        android:id="@+id/cvFaqs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorWhite"
        app:cardCornerRadius="@dimen/card_content_radius">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="@dimen/_16sdp"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tvFaqTitle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="8dp"
                android:drawableEnd="@drawable/ic_up_arrow"
                android:drawableRight="@drawable/ic_up_arrow"
                android:text="@string/faq"
                android:textColor="@color/colorBlack"
                android:textStyle="bold" />

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/rcFaqs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:adapter="@{faqViewModel.faqsAdapter}" />
        </LinearLayout>
    </androidx.cardview.widget.CardView>
</layout>
android android-recyclerview recycler-adapter android-databinding android-mvvm
1个回答
0
投票

简单来说,您似乎忘记了将适配器设置为recyclerview:

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    binding.viewFaqs.rcFaqs.layoutManager = LinearLayoutManager(context)
    viewModel = ViewModelProviders.of(this).get(FragLoanViewModel::class.java)
    //Here do somthing like:
    //binding.viewFaqs.rcFaqs.adapter = viewModel.faqsAdapter
}
© www.soinside.com 2019 - 2024. All rights reserved.