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

问题描述 投票:1回答:1

我的应用程序内部有一个viewPager,其中包含3个片段。单击“ recyclerview”项后,“第一个片段”有一个“ recyclerview”,我将一些数据传递给另一个片段,这不是“ viewpager”片段的一部分。我正在使用最新的viewmodel逻辑来实现此功能,并且按照许多网站提到的步骤,我正在执行以下操作。

  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中,我实现了click侦听器,并在我的片段中实现了它,并使用位置和值覆盖了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)
    })
    

所以所有逻辑都完成了将数据从一个片段传递到另一个片段的操作,但是问题是我没有在明细片段上获取数据。我在这里想念的是什么。

android android-fragments android-recyclerview android-viewmodel
1个回答
0
投票

使用最新的ViewModel库,可以在Activity的各个片段之间创建和共享ViewModel更加容易:

首先在应用程序模块的build.gradle中添加activity-ktx和fragment-ktx依赖性:

dependencies {

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

    // For Fragment
    def fragment_version = "1.3.0"
    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()
}
© www.soinside.com 2019 - 2024. All rights reserved.