使用DiffUtil.ItemCallback时,ListAdapter的初始数据被擦除

问题描述 投票:0回答:1

在我的应用中,我有两个LiveData对象,一个用于从0-10获取项目,第二个用于从11-20获取项目。我正在尝试将数据加载到RecyclerView中,但是前20(0-10)个不是20个,而是被新的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类:

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

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

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

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)?

android android-livedata android-viewmodel android-listadapter
1个回答
0
投票

DiffUtil.ItemCallback用于为适配器中数据集中的平滑变化设置动画。

例如,如果您有10个项目,而不是提交列表中前10个项目中包含9个项目,则DiffUtil.ItemCallback将确定新旧列表之间的差异,该元素所处的位置并为其设置动画。在这种情况下,您要寻找的是Pagination,您可以在滚动时展开/显示项目。

您不需要两个LiveData,您可以从某些来源投射数据并将其添加到LiveDataPagination中。首先将显示10个项目,然后滚动到另外10个项目,依此类推。您可以通过提供的Configuration来调整分页类型。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.