Android 刷新RecycleView的ListAdapter时出现问题

Android 刷新RecycleView的ListAdapter时出现问题,android,android-recyclerview,mutablelivedata,Android,Android Recyclerview,Mutablelivedata,我试图观察MutableLiveData并刷新RecycleView,但它不起作用。这是我的片段代码: class NowyZestaw : Fragment() { val setEditModeViewModel: SetEditModeViewModel by activityViewModels() @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) val bazaModel: Ba

我试图观察MutableLiveData并刷新RecycleView,但它不起作用。这是我的片段代码:

class NowyZestaw : Fragment() {

    val setEditModeViewModel: SetEditModeViewModel by activityViewModels()
    


    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
    val bazaModel: BazaModel by activityViewModels()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val root = inflater.inflate(R.layout.nowy_zestaw, container, false)
        root.findViewById<RecyclerView>(R.id.flashcard_recycler).isNestedScrollingEnabled = false
        return root
    }

    @SuppressLint("ShowToast")
    override fun onViewCreated(root: View, savedInstanceState: Bundle?) {
        val addFlashcard: Button = root.findViewById(R.id.dodajFiszke)
        addFlashcard.setOnClickListener {
            val fiszka = Fiszka(0, "test", "test", 1)
//            bazaModel.dodajFiszke(fiszka)
            setEditModeViewModel.addNewFlashcard(Fiszka(1, "raz", "raz", 1))
        }

        val recyclerView: RecyclerView = root.findViewById(R.id.flashcard_recycler)
        recyclerView.layoutManager = LinearLayoutManager(root.context)

        val adapter = SetAdapter()
        recyclerView.adapter = adapter

        setEditModeViewModel.flashcards.observe(viewLifecycleOwner, Observer { flashcardList ->
            Log.d("ANDROID", flashcardList.size.toString())
            adapter.submitList(flashcardList)
        })
    }
}
class NowyZestaw:Fragment(){
val setEditModeViewModel:setEditModeViewModel by activityViewModels()
@VisibleForTesting(否则=VisibleForTesting.PRIVATE)
val bazaModel:activityViewModels()的bazaModel
覆盖创建视图(
充气机,
容器:视图组?,
savedInstanceState:捆绑?
):查看{
val root=充气机。充气(R.layout.nowy_zestaw,容器,假)
root.findviewbyd(R.id.flashcard\u recycler).isNestedScrollingEnabled=false
返回根
}
@SuppressLint(“ShowToast”)
覆盖已创建的视图(根:视图,savedInstanceState:Bundle?){
val addFlashcard:Button=root.findViewById(R.id.dodajFiszke)
addFlashcard.setOnClickListener{
val fiszka=fiszka(0,“测试”,“测试”,1)
//bazaModel.dodajFiszke(fiszka)
setEditModeViewModel.addNewFlashcard(Fiszka(1,“raz”,“raz”,1))
}
val recyclerView:recyclerView=root.findviewbyd(R.id.flashcard\u recycler)
recyclerView.layoutManager=LinearLayoutManager(root.context)
val adapter=SetAdapter()
recyclerView.adapter=适配器
setEditModeViewModel.flashcards.observe(viewLifecycleOwner,Observer{flashcardList->
Log.d(“ANDROID”,flashcardList.size.toString())
适配器提交列表(flashcardList)
})
}
}
这是我的视图模型:

class SetEditModeViewModel : ViewModel() {

    val flashcards = MutableLiveData<MutableList<Fiszka>>().apply {
        value = mutableListOf()
    }

    fun addNewFlashcard(item: Fiszka) {
        flashcards.value?.add(item)
        flashcards.value = flashcards.value
    }
}
class SetEditModeViewModel:ViewModel(){
val flashcards=MutableLiveData()。应用{
value=mutableListOf()
}
fun addNewFlashcard(项目:Fiszka){
抽认卡。价值?。添加(项目)
flashcards.value=flashcards.value
}
}
和xml行:

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/flashcard_recycler"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                tools:listitem="@layout/nowa_fiszka" />

        </RelativeLayout>


当我单击控制台中的按钮时,会显示正确大小的列表,因此这意味着观察到的内容会得到通知。例如,当我更改智能手机方向时,项目将显示在循环视图中。更重要的是,若我观察房间数据库,它会返回LiveData—一切正常。也许它只适用于LiveData,而不适用于MutableLiveData,但我不知道为什么会发生这种情况。总而言之,我希望在单击按钮后,新项目出现在RecyclerView中。有人能帮我吗?

在您的observer中,您应该调用notifyDataSetChanged()

    setEditModeViewModel.flashcards.observe(viewLifecycleOwner, Observer { flashcardList ->
        Log.d("ANDROID", flashcardList.size.toString())
        adapter.submitList(flashcardList)
        adapter.notifyDataSetChanged();  // This is needed
    })