Передача данных из фрагмента с помощью recyclerview в другой фрагмент с помощью ViewModel в android - PullRequest
1 голос
/ 07 мая 2020

У меня есть viewPager внутри моего приложения, которое содержит 3 фрагмента. Первый фрагмент имеет recyclerview при щелчке по элементу recyclerview. Я передаю некоторые данные другому фрагменту, который не является частью фрагментов viewpager. Я использую последнюю версию logi модели просмотра c для достижения этой функции, и в соответствии с шагами, упомянутыми на многих веб-сайтах, я делаю следующее.

  1. Создание отдельного класса, расширяющего модель просмотра

    class MovieObservable : ViewModel() {
    
    private val selectedMovieID = MutableLiveData<Int>()
    
    fun setSelectedMovieID(id : Int){
        selectedMovieID.value = id 
    }
    
    fun getSelectedMovieID(): MutableLiveData<Int> {
        return selectedMovieID
    }
    
  2. Инициализировать модель просмотра внутри фрагмента oncreateView

    private lateinit var mViewModel : MovieObservable
    mViewModel = ViewModelProvider(this).get(MovieObservable::class.java)
    
  3. Теперь из моего RecyclerView я реализовал прослушиватель кликов и реализовал его в моем фрагмент и переопределение события onclick с положением и значением

    override fun onClickNowPlaying(position: Int, view: View, result: Result) {
    
    System.out.println("now playing ID" + result.id)
    mViewModel.setSelectedMovieID(result.id)
    val newFragment = MovieDetailsFragment()
    val transaction = activity?.supportFragmentManager?.beginTransaction()
    transaction?.replace(R.id.mainLayout, newFragment, "NewFragment")
    transaction?.addToBackStack(null)
    transaction?.commit()
    }
    
  4. Я добавляю logi c наблюдения за значением во фрагменте деталей, который находится ниже

     private lateinit var mViewModel : MovieObservable
     mViewModel = ViewModelProvider(this).get(MovieObservable::class.java)
     mViewModel.getSelectedMovieID().observe(viewLifecycleOwner, Observer {getmydata->
        System.out.println("in the next fragment " + getmydata)
    })
    

Итак, все logi c завершено для передачи данных из одного фрагмента в другой, но проблема в том, что я не получаю данные по фрагменту деталей. Что мне здесь не хватает.

1 Ответ

1 голос
/ 08 мая 2020

С последней библиотекой ViewModel стало еще проще создавать ViewModel и совместно использовать его между фрагментами Activity:

Сначала добавьте зависимости activity-ktx и fragment-ktx в build.gradle вашего модуля приложения:

dependencies {

    // For Activity
    def activity_version = "1.2.0-alpha04"
    implementation "androidx.activity:activity-ktx:$activity_version"

    // For Fragment
    def fragment_version = "1.3.0-alpha04"
    implementation "androidx.fragment:fragment-ktx:$fragment_version"

}

Предположим, ваша ViewModel имеет вид:

class MyViewModel : ViewModel() { }

Затем в вашей деятельности:

class MyActivity : AppCompatActivity() {

    // Use the 'by viewModels()' Kotlin property delegate 
    // from the activity-ktx artifact
    val model: MyViewModel by viewModels()
}

И тогда ваши фрагменты будут иметь:

class MyFirstFragment : Fragment() {

    // Use the 'by activityViewModels()' Kotlin property delegate
    // from the fragment-ktx artifact
    private val model: MyViewModel by activityViewModels()
}

class MySecondFragment : Fragment() {

    // Use the 'by activityViewModels()' Kotlin property delegate
    // from the fragment-ktx artifact
    private val model: MyViewModel by activityViewModels()
}
...