将ArrayAdapter与LiveData一起使用



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

这正确吗?这似乎是疯狂的方式。

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

我希望已经有一个MutableLiveData集合准备好了,我会使用它。

做这件事的标准方法是什么?

我认为你的想法是错误的。不用担心:

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

最新更新