ViewModel 在 Activity 中设置数据并在 Fragment 中使用
ViewModel set data in Activity and use in Fragment
我正在尝试不实现 ViewModel,请帮助我解决这个问题。我希望在 Activity 中设置数据并在 Fragment
中使用它
主要Activity:
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)
}
}
片段:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_list2, container, false)
val model = ViewModelProvider(activity!!).get(TapupuViewModel::class.java)
model.message.observe(viewLifecycleOwner, Observer {
it?.let {
moviesArrayList = it
}
})
}
我可能在那里做错了什么。你能帮帮我吗?
View <---> ViewModel <---> Repository <---> Room Dao
观点是:Fragment/Activity
不需要 在您的 Activity 和 Fragment 之间共享任何 ViewModel 或...。
class MyRepository {
private val dao: YourDao = ...
fun getModelFromLocal(): LiveData/RxJava/List<Model> = dao.getModel()
}
在您的 ViewModel 中
private val repository: MyRepository = ...
val resultLiveData = MutableLiveData<SomeModelToShowOnUI>()
fun onUISentEventToLoadData() {
val data: SomeModelToShowOnUI = repository.getModelFromLocal()
resultLiveData.value = data
}
Activity/Fragment 观察 ViewModel 的变化:
class MyFragment : Fragment() {
override fun onViewCreated() {
resultLiveData.observe(this, Observer {
//update UI
})
}
}
每个 Fragment/Activity 都有自己的实现。
我正在尝试不实现 ViewModel,请帮助我解决这个问题。我希望在 Activity 中设置数据并在 Fragment
中使用它主要Activity:
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)
}
}
片段:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_list2, container, false)
val model = ViewModelProvider(activity!!).get(TapupuViewModel::class.java)
model.message.observe(viewLifecycleOwner, Observer {
it?.let {
moviesArrayList = it
}
})
}
我可能在那里做错了什么。你能帮帮我吗?
View <---> ViewModel <---> Repository <---> Room Dao
观点是:Fragment/Activity
不需要 在您的 Activity 和 Fragment 之间共享任何 ViewModel 或...。
class MyRepository {
private val dao: YourDao = ...
fun getModelFromLocal(): LiveData/RxJava/List<Model> = dao.getModel()
}
在您的 ViewModel 中
private val repository: MyRepository = ...
val resultLiveData = MutableLiveData<SomeModelToShowOnUI>()
fun onUISentEventToLoadData() {
val data: SomeModelToShowOnUI = repository.getModelFromLocal()
resultLiveData.value = data
}
Activity/Fragment 观察 ViewModel 的变化:
class MyFragment : Fragment() {
override fun onViewCreated() {
resultLiveData.observe(this, Observer {
//update UI
})
}
}
每个 Fragment/Activity 都有自己的实现。