我下面的代码在两个列表之间使用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());

09-11 19:33