Android ViewModel在活动中设置数据并在片段中使用

Android ViewModel在活动中设置数据并在片段中使用,android,android-fragments,android-viewmodel,Android,Android Fragments,Android Viewmodel,我正在尝试不实现ViewModel,请帮助我了解这一点。我希望在活动中设置数据并在片段中使用它 主要活动: class MainActivity : AppCompatActivity(),ListFragment.OnFragmentInteractionListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) s

我正在尝试不实现ViewModel,请帮助我了解这一点。我希望在活动中设置数据并在片段中使用它

主要活动:

class MainActivity : AppCompatActivity(),ListFragment.OnFragmentInteractionListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)


        var viewModel = ViewModelProvider.NewInstanceFactory().create(TapupuViewModel::class.java)
        viewModel.setData(movieList)
    }
    }
视图模型:

class TapupuViewModel : ViewModel() {

    val message  = MutableLiveData<ArrayList<Movie>>()

    fun setData(msg:ArrayList<Movie>){
        message.setValue(msg)
    }
}
class MyFragment : Fragment() {
    override fun onViewCreated() {
        resultLiveData.observe(this, Observer {
            //update UI
        })
    }
}
我可能在那里做错了什么。您能帮我吗?

查看ViewModel存储库房间Dao

视图是:片段/活动

需要共享任何ViewModels或。。。在你的活动和片段之间

class MyRepository {
    private val dao: YourDao = ...

    fun getModelFromLocal(): LiveData/RxJava/List<Model> = dao.getModel()
}

每个片段/活动都有自己的实现。

Hmmm,有点不清楚您想要实现什么?将数据从活动发送到片段?或者在他们之间共享一个ViewModel?我有两个片段的活动,它们一个叠在另一个之上。我正在活动中从DB加载数据,然后我希望在两个片段中都使用它。这是我第一次尝试用Kotlin实现ViewModel,可能是我的代码中有错误。您是否遇到运行时错误?请添加错误日志。@AmitGupta moviesaraylist在中为空fragment@Dim如果要使用MVVM,则需要实现存储库模式以从数据库中获取数据。您想要实现的不是逻辑上的实现,而是绝对可行的。
private val repository: MyRepository  = ...
val resultLiveData = MutableLiveData<SomeModelToShowOnUI>()

fun onUISentEventToLoadData() {
    val data: SomeModelToShowOnUI = repository.getModelFromLocal()
    resultLiveData.value = data
}
class MyFragment : Fragment() {
    override fun onViewCreated() {
        resultLiveData.observe(this, Observer {
            //update UI
        })
    }
}