如何解决对话框关闭后,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]
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。