将 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();
}
});
我熟悉 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();
}
});