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

Using MutableLiveData, update data from Activity to Fragment

我使用 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
}

Fragment: 我正在使用下面的方法观察 Fragment 中的数据,但这里没有观察

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 class 中使用相同的代码,它工作正常。 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 的回答,如果我将其更改为 activity,我将遇到以下编译时错误

答案:

感谢 Hein Htet Aung

我在 Fragment

中使用以下代码得到了解决方案
sharedVM = ViewModelProvider(activity as MainActivity).get(SharedViewModel::class.java)

在片段内部,转换这一行

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

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

通过使用 activity,viewmodelprovider 将提供来自 activity

的相同视图模型