使用 android 中的 ViewModel 将数据从带有 recyclerview 的片段传递到另一个片段

Pass data from fragment with recyclerview to the other fragment using ViewModel in android

我的应用程序中有一个 viewPager,其中包含 3 个片段。 第一个片段在点击 recyclerview 项目时有一个 recyclerview 我将一些数据传递给另一个片段,它不是 viewpager fragments 的一部分。我正在使用最新的视图模型逻辑来实现此功能,并且根据许多网站提到的步骤,我正在执行以下操作。

  1. 创建单独的 class 扩展视图模型

    class MovieObservable : ViewModel() {
    
    private val selectedMovieID = MutableLiveData<Int>()
    
    fun setSelectedMovieID(id : Int){
        selectedMovieID.value = id 
    }
    
    fun getSelectedMovieID(): MutableLiveData<Int> {
        return selectedMovieID
    }
    
  2. 在oncreateView Fragment中初始化viewmodel

    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. 我在

    下面的细节片段中添加了观察值的逻辑
     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)
    })
    

因此,将数据从一个片段传递到另一个片段的所有逻辑都已完成,但问题是我没有获取详细信息片段上的数据。 我在这里缺少什么。

使用最新的 ViewModel 库,可以更轻松地在 Activity 的片段之间创建和共享 ViewModel:

首先在你的应用模块的 build.gradle:

添加 activity-ktx 和 fragment-ktx 依赖
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() { }

然后,在你的 activity:

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()
}