在我的应用中,我有两个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)?
DiffUtil.ItemCallback
用于为适配器中数据集中的平滑变化设置动画。
例如,如果您有10个项目,而不是提交列表中前10个项目中包含9个项目,则DiffUtil.ItemCallback
将确定新旧列表之间的差异,该元素所处的位置并为其设置动画。在这种情况下,您要寻找的是Pagination,您可以在滚动时展开/显示项目。
您不需要两个LiveData
,您可以从某些来源投射数据并将其添加到LiveData
的Pagination
中。首先将显示10个项目,然后滚动到另外10个项目,依此类推。您可以通过提供的Configuration
来调整分页类型。
无需分页即可完成所有操作。
liveData.observe(this, itemtList -> adapter.submitList(adapter.getCurrentList().addAll(itemtList)));
获取以前的数据,在该数据之上添加新数据,所有这些都将显示出来。