我下面的代码在两个列表之间使用DiffUtil.calculateDiff。每次我进一步向下滚动列表时,都会出现新数据并将其添加到列表中。但是,当结果通知更改时,适配器每次都会将我引导到列表的顶部。
我怎样才能保持添加新数据的位置?
这个例子是DiffUtil.calculateDiff的正确用法?还是我需要使用:
companyList.addAll(companies);
notifyDataSetChanged();
没有DiffUtil.calculateDiff。
public void setProductList(final List<? extends Product> productList) {
if (mProductList == null) {
mProductList = productList;
notifyItemRangeInserted(0, productList.size());
} else {
DiffUtil.DiffResult result = DiffUtil.calculateDiff(new DiffUtil.Callback() {
@Override
public int getOldListSize() {
return mProductList.size();
}
@Override
public int getNewListSize() {
return productList.size();
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return mProductList.get(oldItemPosition).getId() ==
productList.get(newItemPosition).getId();
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
Product newProduct = productList.get(newItemPosition);
Product oldProduct = mProductList.get(oldItemPosition);
return newProduct.getId() == oldProduct.getId()
&& Objects.equals(newProduct.getDescription(), oldProduct.getDescription())
&& Objects.equals(newProduct.getName(), oldProduct.getName())
&& newProduct.getPrice() == oldProduct.getPrice();
}
});
mProductList.addAll(productList);
result.dispatchUpdatesTo(this);
}
}
最佳答案
新列表应同时包含现有项目和新项目。因此,在附加新项目之前,旧列表应为mProductList
的副本,而在附加mProductList
之后,新列表应为productList
。但是,如果您根本不关心现有项的更改,而只是将其追加到列表中而不是进行排序/过滤,则可以使用notifyItemRangeInserted
而不使用DiffUtil
进行工作,在这种情况下,您的else块将会:
int insertIndex = mProductList.size();
mProductList.addAll(productList);
notifyItemRangeInserted(insertIndex, productList.size());