使用 DiffUtil.ItemCallback 时,来自 ListAdapter 的初始数据被删除

Initial data from ListAdapter gets erased when using DiffUtil.ItemCallback

在我的应用程序中,我有两个 LiveData 对象,一个用于获取 0-10 的项目,第二个用于获取 11-20 的项目。我正在尝试将数据加载到 RecyclerView 中,但不是有 20 个项目,前 10 个 (0-10) 被替换为新的 10 个 (11-20)。这是我试过的:

recyclerView = findViewById(R.id.recycler_view);
adapter = new ItemsAdapter();
recyclerView.setAdapter(adapter);
viewModel = new ViewModelProvider(this).get(ItemListViewModel.class);

要获取 0-10 的项目,我使用此方法:

private void getInitialItems() {
    ItemListLiveData liveData = viewModel.getItemsLiveData();
    liveData.observe(this, itemtList -> adapter.submitList(itemtList));
}

要获取 11-20 的项目,我使用此方法:

private void getNextlItems() {
    ItemListLiveData liveData = viewModel.getItemsLiveData();
    liveData.observe(this, itemtList -> adapter.submitList(itemtList));
}

这是我的 ViewModel class:

public class ItemListViewModel extends ViewModel {
    private ItemListRepository repository = new ItemListRepository();

    ItemListLiveData getItemsLiveData() {
        return repository.getItemListLiveData();
    }
}

在存储库中,我只从后端服务器获取项目。这是我的适配器 class:

public class ItemsAdapter extends ListAdapter<Item, ItemsAdapter.ItemViewHolder> {
    ItemsAdapter() {
        super(diffCallback);
    }

    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //Inflate the view
    }

    @Override
    public void onBindViewHolder(@NonNull final ItemViewHolder holder, int position) {
        //Bind the Item according to position
    }

    private static DiffUtil.ItemCallback<Item> diffCallback = new DiffUtil.ItemCallback<Item>() {
        @Override
        public boolean areItemsTheSame(@NonNull Item oldItem, @NonNull Item newItem) {
            return oldItem.id.equals(newItem.id);
        }

        @Override
        public boolean areContentsTheSame(@NonNull Item oldItem, @NonNull Item newItem) {
            return oldItem.equals(newItem);
        }
    };
}

我的期望是在使用 DiffUtil.ItemCallback 时将两个列表作为累积列表获取,因为所有对象都不同。即使我将两个列表传递给同一个适配器,我最终也只有十个项目 (11-20)。如何使用 submit list 以便我的列表中可以包含 20 个项目,而不仅仅是 10 个 (11-20)?

DiffUtil.ItemCallback 用于在适配器中对数据集的平滑变化进行动画处理。

例如,如果您有 10 个项目,而不是提交包含前 10 个项目中的 9 个项目的列表,DiffUtil.ItemCallback 将确定新旧列表之间的差异,元素所在的位置和动画会相应变化.在您的情况下,您正在寻找的是 Pagination 滚动时您可以在其中 expand/show 项目。

这个不需要两个 LiveData,您可以从某个源中获取数据并将其添加到 PaginationLiveData。首先它会显示 10 个项目,然后如果你滚动到另一个 10,等等。您可以根据需要调整分页类型,提供 Configuration.

无需分页即可完成所有操作。

    liveData.observe(this, itemtList -> adapter.submitList(adapter.getCurrentList().addAll(itemtList)));

获取以前的数据,在该数据之上添加新数据,所有数据都会显示出来。