Используя MutableLiveData, обновите данные от Действия до Фрагмента - PullRequest
2 голосов
/ 31 марта 2020

Я использовал SharedViewModel для передачи данных из Activity во фрагмент

Как и в Activity, существует EditText , основанный на том, что я пишу в EditText, 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: Если я использую тот же код в классе Activity, где EditText, он работает нормально. 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)

1 Ответ

2 голосов
/ 31 марта 2020

Внутри фрагмента преобразуйте эту строку

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

в

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

Используя activity, viewmodelprovider предоставит ту же модель представления из действия

...