将 ArrayAdapter 与 LiveData 结合使用。

Using an ArrayAdapter with LiveData.

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

应用程序 "as/was" 有一个自定义的 ArrayAdapter,用于在网格视图中正确显示列表中包含的项目。这样做的代码看起来基本上是这样的("essentially" 因为 activity 中实际上有 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 class 扩展 ArrayAdapter<T>

所以实际上它会变成

ArrayAdapter<MutableLiveData<List<String>>>

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

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

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

这是正确的吗?看来是走疯了。

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

我希望已经有一个 MutableLiveData 集合可以使用,我会使用它。

执行此操作的标准方法是什么?

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

ArrayAdapter<MutableLiveData<List<String>>>

您将得到一份清单,仅此而已。 MutableLiveData 是手动设置一个 livedata 对象,如 setValue() 或 postValue() 。每当 liveData 被触发并为您提供新的播放器列表时,只需设置您的以下代码,如下所示:

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