【问题标题】:Pass data from fragment with recyclerview to the other fragment using ViewModel in android在android中使用ViewModel将数据从带有recyclerview的片段传递到另一个片段
【发布时间】:2020-05-08 11:48:19
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android android-fragments android-recyclerview android-viewmodel


    【解决方案1】:

    使用最新的 ViewModel 库,更容易在 Activity 的 Fragment 之间创建和共享 ViewModel:

    首先在你的app模块的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() { }
    

    然后,在你的活动中:

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

    【讨论】:

    • 感谢您提供的详细信息,您所建议的是解决问题的新方法。我通过在 ViewModelProvider 中传递 requireActivity() 也找到了旧方法。你认为这是实现这一目标的另一种方式(正确的方式)吗?
    • @VishvenduPalawat requireActivity 是正确的方法,前面官方文档中也提到过。
    • 好吧,看来这两种解决方案都是正确的。你建议的那个仍然是最新的,所以我会坚持下去。谢谢
    猜你喜欢
    • 2015-01-14
    • 2021-12-26
    • 2022-07-07
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 2018-04-16
    相关资源
    最近更新 更多