我有一个通用列表,需要在我的应用程序的大多数活动/片段中显示。为此,我创建了一个布局并在其中添加了回收站,如下面的代码所示。然后,根据需要将此布局包括在活动/片段中。我正在使用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>
简单来说,您似乎忘记了将适配器设置为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
}