使用 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
的相同视图模型
我使用 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