从LiveData插入(或删除)单个列表项

时间:2018-03-31 18:19:09

标签: android android-architecture-components android-livedata

我想知道,从List插入(或删除)单个LiveData项目有哪些常见做法?

目前,这是我打算做的事情。

我有以下LiveData

LiveData<List<Animal>> animalListLiveData;

这就是我计划观察它的方式。

animalListLiveData.observe(this, animalList -> {

    if (listView.getAdapter() == null) {
        // First time.

        ArrayAdapter<String> adapter = new ArrayAdapter<>(..., animalList);
        // Assign adapter to ListView
        listView.setAdapter(adapter);

    } else {
        // Update operation.

        DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new MyDiffUtilCallback(animalList, oldAnimalList));
        diffResult.dispatchUpdatesTo(listView.getAdapter());
    }

    oldAnimalList.clear(); 
    oldAnimalList.addAll(animalList);
});

这就是我要将单个项目插入LiveData

的方法
animalListLiveData.getValue().add(newAnimal);
// Inform observer.
animalListLiveData.setValue(animalListLiveData.getValue())

我觉得我的方法对于这种简单的更新操作来说太过分了。如果List很大,则DiffUtil需要浏览整个List

其他开发者和我一样有同样的感觉。 https://github.com/googlesamples/android-architecture-components/issues/135

到目前为止尚无好的解决方案。

我想知道,您是否发现任何良好做法(模式),从List插入(或删除)单个LiveData项目?

1 个答案:

答案 0 :(得分:4)

如果您确切知道更改的确切位置,例如在按时间顺序排列新项目的情况下,您可以手动报告对适配器的更改。

如果没有,您需要让适配器知道哪些项目已更改。

当天结束,这些是您的选择:

如果插入和删除是确定性的,您可以直接通知适配器。没有中间人需要。

如果没有,您有两个选择。通知适配器整个数据集已更改,或检查每个条目以验证位置(DiffUtil)。

作为旁注,您应该将适配器设置在观察者之外。直接在onCreate(或类似)上,使用类中预定义的空List。然后,您可以编辑此列表以响应来自observable的更改。