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

时间:2019-10-30 12:03:15

标签: android android-livedata android-viewmodel android-listadapter

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

Configuration

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