3

我熟悉 WPF 中的 MVVM,但我正在移植现有的 Android 应用程序以首次使用 ViewModel 类和 LiveData。

应用程序“as/was”有一个自定义 ArrayAdapter,用于正确显示网格视图中列表中包含的项目。执行此操作的代码基本上看起来像这样(“基本上”,因为活动中实际上有 4 个这样的网格都这样做):

ArrayAdapter<String> playerAdapter = new MyAdapter<String>(this, R.layout.grid_item, playerList);

gridView.setAdapter(playerAdapter)

当 playerList 内容改变时,有一个明确的调用

playerAdapter.notifyDataSetChanged()

由于我的目标是让网格在 playerList 更改时自动响应,并且永远不必通知任何内容,现在看来“playerList”需要成为MutableLiveData<List<String>>.

我怀疑我会遇到问题——

MyAdapter 类扩展ArrayAdapter<T>

所以在实践中它会变成一个

ArrayAdapter<MutableLiveData<List<String>>>

但是 MutableLiveData 不会在那里工作,对吧?

我可以打开它并调用创建它,如下所示:

ArrayAdapter<String> playerAdapter = 
new MyAdapter<String>(this, R.layout.grid_item, playerList.getValue());

这个对吗?这似乎是疯狂的方式。

最终我的目标是在 xml 中将 gridView 的android:adapter属性分配给这个东西,并且永远不必再考虑它(除了当我修改底层列表时对 setvalue() 和 postValue() 的必需调用......我不是甚至确定如何在这里工作。

我希望已经有一个 MutableLiveData Collection 准备好去某个地方,我会使用它。

这样做的标准方法是什么?

4

1 回答 1

2

我相信你的想法是错误的。不要担心这个:

ArrayAdapter<MutableLiveData<List<String>>>

你会得到一个列表,仅此而已。MutableLiveData 是手动设置像 setValue() 或 postValue() 这样的 livedata 对象。只需在 liveData 被触发并为您提供新的 playerList 时设置以下代码,如下所示:

viewModel.getPlayListObservable().observe(this, new Observer<List<String>>() {
        @Override
        public void onChanged(List<String> playerList) {
            ArrayAdapter<String> playerAdapter = new MyAdapter<String>(this, R.layout.grid_item, playerList);
            gridView.setAdapter(playerAdapter);
            playerAdapter.notifydataChanged();
        }
    });
于 2018-11-20T10:55:44.927 回答