对话框关闭后,ViewModel仍显示旧数据,父片段返回查看

问题描述

由于我还拥有一个对话框和recyclerview项,因此我仍在努力处理viewmodel,这有点困惑,但是如果可以得到任何帮助,我会在这里尽可能地清楚。 / p>

我有一个对话框,其中的项目被选中并关闭时,应该将数据返回到我的调用片段,以便所选项目显示在该视图下。

但是,一旦选择了该项目并关闭了对话框,我看不到新选择的项目是UI上显示的项目,而是旧项目。 (当片段首次启动时,它会显示设置为列表中所选项目的项目。所选值最初是硬编码的,但是在单击该项目时会更新,并且当我在其中调试viewmodel观察器时,我看到更新已经发生对话框的ondismiss方法

我花了几个小时,尝试了一些不同的事情,例如在onResume或ondismiss内调用viewmodel并按照this post更改要初始化的by by activityviewmodels()viewmodel,但是没有一个到目前为止,这些方法已经奏效了,我认为我目前仍处于困境。在我最新版本的代码下面。

class CovidCheckInFragment : Fragment(R.layout.fragment_covid_check_in) {

var navController: NavController? = null
private val model: Mainviewmodel by activityviewmodels()

@RequiresApi(Build.VERSION_CODES.M)
override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
    super.onViewCreated(view,savedInstanceState)

    navController = Navigation.findNavController(view)
    
    model.usermutablelivedata.observe(viewLifecycleOwner,Observer<Any?> { list ->
        if (list != null)

            (list as Iterable<*>).map {

                if ((it as ModelDialogoption).selected == true) {
                    tvHeader.text = it.title
                }

            }

    })

}

}

..

class MyDialogFragment : DialogFragment(),RecyclerDialogoptionsItem.AdapterListener {

private val viewmodel: Mainviewmodel by activityviewmodels()
private lateinit var adapter: GroupAdapter<GroupieViewHolder>
var selectedPosition = -1

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setStyle(STYLE_NO_TITLE,R.style.AppTheme_Dialog_Custom)
}

override fun onCreateView(
    inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.fragment_dialog,container,false)
}

override fun onViewCreated(view: View,savedInstanceState)
    
    rvOptions.layoutManager = linearlayoutmanager(activity)
    adapter = GroupAdapter()
    rvOptions.adapter = adapter


    ivClose.setonClickListener {

        this.dismiss()
    }


    initviewmodel()
}

private fun initviewmodel() {

    viewmodel.usermutablelivedata.observe(this,Observer { list ->
        for (i in list!!) {
            adapter.add(
                RecyclerDialogoptionsItem(
                    this@MyDialogFragment,i,this@MyDialogFragment
                )
            )
        }

    })

}

override fun onClickItem(position: Int) {

    selectedPosition = position
    adapter.notifyDataSetChanged()

    Log.i("clicked","position: $position")
}

}

..

class Mainviewmodel : viewmodel() {

private var list: ArrayList<ModelDialogoption>? = null

val usermutablelivedata: mutablelivedata<ArrayList<ModelDialogoption>?> = mutablelivedata()

init {
    populateList()
    usermutablelivedata.value = list!!
}

private fun populateList() {

    list = ArrayList()

    list!!.add(ModelDialogoption("Prefer not to say",false))
    list!!.add(ModelDialogoption("16-39",false))
    list!!.add(ModelDialogoption("40-59",true))
    list!!.add(ModelDialogoption("60+",false))
}

}

..

class RecyclerDialogoptionsItem(
private val fragment: MyDialogFragment,private val modelDialogoption: ModelDialogoption,private val adapterListener: AdapterListener
) : Item<GroupieViewHolder>() {

companion object {
    var clickListener: AdapterListener? = null
}

override fun bind(viewHolder: GroupieViewHolder,position: Int) {

    viewHolder.apply {

        with(viewHolder.itemView) {

            tvTitle.text = modelDialogoption.title

            clickListener = adapterListener

            if (fragment.selectedPosition == position) {
                ivChecked.visible()
                modelDialogoption.selected = true

            } else {
                ivChecked.invisible()
                modelDialogoption.selected = false
            }

            itemView.setonClickListener {

                clickListener?.onClickItem(adapterPosition)

            }

        }

    }

}

override fun getLayout() = R.layout.rv_options_item_row

interface AdapterListener {
    fun onClickItem(position: Int)
}

}

非常感谢您。

解决方法

您的主视图模型应该是这样

Dir

}

然后来自MyDialogFragment的应该是这样。

[NotNull]

}