我使用了SharedViewModel的概念,将数据从Activity传递到Fragment。
例如,在Activity中有一个EditText,根据我在EditText中输入的内容,Fragment的RecyclerView应该显示过滤后的数据。
ViewModel:
根据 @Hein Htet Aung 的回答,如果我将此更改为活动,则会出现以下编译时错误。
例如,在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 的回答,如果我将此更改为活动,则会出现以下编译时错误。
答案:
感谢Hein Htet Aung的帮助。
我使用以下代码在片段中解决了问题。
sharedVM = ViewModelProvider(activity as MainActivity).get(SharedViewModel::class.java)