android - ViewModel在Activity中设置数据并在Fragment中使用
问题描述
我正在尝试不实现 ViewModel,请帮我解决这个问题。我希望在 Activity 中设置数据并在 Fragment 中使用它
主要活动:
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
视图是:片段/活动
无需在 Activity 和 Fragments 之间共享任何 ViewModel 或 ...。
class MyRepository {
private val dao: YourDao = ...
fun getModelFromLocal(): LiveData/RxJava/List<Model> = dao.getModel()
}
在您的视图模型中
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
})
}
}
每个片段/活动都有自己的实现。
推荐阅读
- php - php mysql中的多行插入错误
- javascript - 如何根据angularjs中的json值修改ng重复的特定div
- ruby-on-rails - ActiveRecord::Associations::Preloader 只预加载一些关系
- assembly - 开始组装,简单的计算器问题
- javascript - 无法从新窗口获取隐藏值(角度/javascript)
- sql - 将声明的变量设置为 2 个连接列
- php - 如何在laravel中输出奇偶行
- angular - 如何获取价值而不是Angular Reactive表单控件的viewValue?
- python - 查找数组中匹配某个条件的第一个元素的索引
- c# - C# sql 命令参数没有被使用?