首页 > 解决方案 > 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

            }
        })
        }

我可能在那里做错了什么。你能帮我么?

标签: androidandroid-fragmentsandroid-viewmodel

解决方案


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

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


推荐阅读