使用 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
,您可以从某个源中获取数据并将其添加到 Pagination
的 LiveData
。首先它会显示 10 个项目,然后如果你滚动到另一个 10,等等。您可以根据需要调整分页类型,提供 Configuration
.
无需分页即可完成所有操作。
liveData.observe(this, itemtList -> adapter.submitList(adapter.getCurrentList().addAll(itemtList)));
获取以前的数据,在该数据之上添加新数据,所有数据都会显示出来。
在我的应用程序中,我有两个 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
,您可以从某个源中获取数据并将其添加到 Pagination
的 LiveData
。首先它会显示 10 个项目,然后如果你滚动到另一个 10,等等。您可以根据需要调整分页类型,提供 Configuration
.
无需分页即可完成所有操作。
liveData.observe(this, itemtList -> adapter.submitList(adapter.getCurrentList().addAll(itemtList)));
获取以前的数据,在该数据之上添加新数据,所有数据都会显示出来。