将用户输入保存在对话框片段上后,无法更新父列表

我正在使用MVVM和导航组件构建示例应用程序。下面是导航图,

<navigation 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:id="@+id/nav_graph_sample" app:startDestination="@id/FHomePage">
<fragment
        android:id="@+id/FHomePage"
        android:name="com.sample.FHomePage"
        android:label="layout_home_page" tools:layout="@layout/layout_layout_home_page">
    <action
            android:id="@+id/action_FHomePage_to_popup"
            app:destination="@id/popupDialog"
            app:enterAnim="@anim/nav_default_enter_anim"
            app:exitAnim="@anim/nav_default_exit_anim"
            app:popEnterAnim="@anim/nav_default_pop_enter_anim"
            app:popExitAnim="@anim/nav_default_pop_exit_anim"
            app:popUpTo="@+id/FHomePage" />
</fragment>
<dialog
        android:id="@+id/popupDialog"
        android:name="com.sample.PopupDialog"
        android:label="layout_pop_up_dialog"
        tools:layout="@layout/layout_pop_up_dialog" />

这是一个简单的应用程序,可打开包含项目列表的主页。单击按钮后,它会打开一个对话框片段-一种小形式,需要用户输入三个文本。当用户单击“保存”按钮时,它将关闭对话框,将这些值传递回首页片段并更新列表

这是主页的ViewModel

class HomePageViewModel : ViewModel() {
    val listItems = mutableListOf<FormEntity>() //used by recyclerview
    val listItemsLiveData = MutableLiveData<List<FormEntity>>()

    init {
       listItemsLiveData.postvalue(listItems)
    }

    fun saveForm(value1: String,value2: String,value3: String) {
       listsItems.add(FormEntity(value1,value2,value3))
       listItemsLiveData.postvalue(listItems)
    }
}

与此同时,recyclerview侦听listItemsLiveData以获得主页上的任何更改

<androidx.recyclerview.widget.RecyclerView
            android:id="@+id/list_items"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:data="@{viewModel.listItemsLiveData}"
            />

Recyclerview适配器使用数据绑定来更新如下所示的列表

@BindingAdapter("data")
@JvmStatic fun setItems(recyclerView: RecyclerView,resource: List<FormEntity>?) {
    with(recyclerView.adapter as CustomListAdapter) {
        resource?.let { updateData(it) }
    }
}

上述绑定将在适配器中调用以下内容

fun updateData(items: List<FormEntity>) {
    this.items.clear()
    this.items.addAll(items)
    notifyDataSetChanged()
}

在Java中,我们可以设置目标片段并调用onactivityResult(...)方法。但是,我不确定如何使用适当的导航组件来完成此操作。在某些社区帖子中建议使用关于activity的共享ViewModel。不确定这是否是正确的方法。

我尝试了另一种方法。在弹出的对话框片段中,单击“保存”按钮时,我将校准主页ViewModel以保存表单

btn_save.setOnClicklistener {
        viewModelObj.saveForm(
            value1,value2
            value3
        )
        dismiss()
}

viewModelObj是主页ViewModel实例,该实例在弹出对话框中再次启动

private val viewModelObj by lazy {
    ViewModelProviders.of(this,factory).get(FHomePage::class.java)
}

在调试时,单击弹出对话框上的“保存”按钮时,它将表单数据传递到ViewModel,并将值发布到实时数据中。但是,recyclerview适配器不会更新列表。您知道什么可能会阻止它吗?

还是我需要在导航图上添加一个新操作,该导航图从对话框流回到包含表单数据的主页?

KINQWER123456789 回答:将用户输入保存在对话框片段上后,无法更新父列表

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3105548.html

大家都在问