+-
android-从LiveData插入(或删除)单个列表项
我想知道,从LiveData中插入(或删除)单个List项有哪些常用做法?

目前,这是我计划要做的.

我有以下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())

我觉得对于这样一个简单的更新操作,我的方法是过大的.如果列表很大,则DiffUtil需要扫描整个列表.

其他开发人员也有与我相同的感觉. https://github.com/googlesamples/android-architecture-components/issues/135

到目前为止,没有建议好的解决方案.

我想知道,您发现从LiveData中插入(或删除)单个List项的任何好习惯(模式)吗?

最佳答案
如果您确切知道更改的位置,例如在按时间顺序出现新项目的情况下,则可以手动向适配器报告更改.

如果不是,则需要以某种方式让适配器知道哪些项目已更改.

最后,这是您的选择:

如果确定是插入和删除,则可以直接通知适配器.无需中间人.

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

作为旁注,您应该将适配器设置在观察者之外.直接使用类中预定义的空List进行onCreate(或类似操作).然后,您可以根据可观察对象的更改来编辑此列表.

点击查看更多相关文章

转载注明原文:android-从LiveData插入(或删除)单个列表项 - 乐贴网