使用MutableLiveData,将Activity中的数据更新到Fragment

4
我使用了SharedViewModel的概念,将数据从Activity传递到Fragment。
例如,在Activity中有一个EditText,根据我在EditText中输入的内容,Fragment的RecyclerView应该显示过滤后的数据。
ViewModel:
fun onSearchChanged(s: CharSequence, start: Int, before: Int, count: Int) {
    mutableChangedText.postValue(s.toString())
}

fun getSearchChangedText(): MutableLiveData<String> {
    return mutableChangedText
}
片段:我正在使用下面的方法观察片段中的数据,但是这里没有观察到。
private lateinit var sharedVM: SharedViewModel

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

    fragmentBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_list_passwords, container, false)
    sharedVM = ViewModelProvider(this).get(SharedViewModel::class.java)
    fragmentBinding.appListViewModel = sharedVM
    observeSearchText()
    return fragmentListPasswordBinding.root
}
private fun observeSearchText() {
    sharedVM.getSearchChangedText().observe(viewLifecycleOwner, Observer {
        Log.d(TAG, "value = $it")
    })
}

MainActivity: 如果我在包含EditText的Activity类中使用相同的代码,它可以正常工作。 private lateinit var sharedVM: SharedViewModel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
    sharedVM = ViewModelProvider(this).get(SharedViewModel::class.java)
    activityMainBinding.appListViewModel = sharedVM

    observeSearchText()
}

private fun observeSearchText() {
    sharedVM.getSearchChangedText().observe(this, Observer {
        Log.d(TAG,"value = $it") 
    })
}

根据 @Hein Htet Aung 的回答,如果我将此更改为活动,则会出现以下编译时错误。

enter image description here

答案:

感谢Hein Htet Aung的帮助。

我使用以下代码在片段中解决了问题。

sharedVM = ViewModelProvider(activity as MainActivity).get(SharedViewModel::class.java)

从上面的代码中,我没有看到问题。也许可以检查一下Logcat是否有警告或错误信息。 - Jemshit Iskenderov
1
如何在Fragment中注入SharedViewModel? - Hein Htet Aung
是的,也许注入是个问题。 - Jemshit Iskenderov
让我更新代码。 - Siddhpura Amit
sharedVM = ViewModelProvider(activity).get(SharedViewModel::class.java) 转换为activity。 - Hein Htet Aung
显示剩余3条评论
1个回答

4
在片段中,将此行转换为:
sharedVM = ViewModelProvider(this).get(SharedViewModel::class.java)

to

sharedVM = ViewModelProvider(activity).get(SharedViewModel::class.java)

通过使用activity,viewmodelprovider将从activity提供相同的viewmodel。

它显示了一个错误,类型不匹配,需要:ViewModelStoreOwner,找到FragmentActivity。 - Siddhpura Amit
是的,我正在使用AndroidX。 - Siddhpura Amit
抱歉,只是为了确认一下。您现在使用的AppCompat版本是哪一个? - Hein Htet Aung
尝试使用?.let - Hein Htet Aung
1
我已经使用 ViewModelProvider(activity as MainActivity) 完成了,现在它能正常工作了,谢谢。 - Siddhpura Amit
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接