gpt4 book ai didi

android - 使用 diff utils 更新回收器 View 适配器,添加项目时无法正常工作

转载 作者:行者123 更新时间:2023-12-04 11:36:48 25 4
gpt4 key购买 nike

我正在使用 diff utils 更新我的回收器 View (来自 View 模型的实时数据返回一个列表),我有一个项目装饰,它向列表中的最后一个元素添加了大量的填充,但是 diff utils 正确更新了回收器 View 通过调用 notifyItemInserted 而不是 notifyDataSetChanged,装饰仅应用于添加的最后一个元素,因此如果我将一个项目添加到我的回收站 View 并调用通知数据集更改适配器重建,我的所有项目最后都会有大量的填充所有项目和填充仅在最后一个元素上(这是我想要的)如果我添加两次相同的项目,它会在最后一次添加之前添加它,例如如果我有一个 1、2、3 的列表并且我添加在现有的 3 之前添加了另外 3 个,所以 1、2、3b、3a,有没有办法对此进行更多控制?

元素装饰

public class PredictionsHorizontalSpaceCardDecoration extends RecyclerView.ItemDecoration {

private final int horizontalSpace;
private final int endSpace;

public PredictionsHorizontalSpaceCardDecoration(int horizontalSpace, int endSpace) {
this.horizontalSpace = horizontalSpace;
this.endSpace = endSpace;
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
Log.d("Deco", "parent child count " + (parent.getChildCount() - 1) + " position " + parent.getChildAdapterPosition(view));
outRect.right = horizontalSpace;
outRect.top = horizontalSpace;
outRect.bottom = horizontalSpace;
outRect.left = horizontalSpace;

if (parent.getChildAdapterPosition(view) == parent.getChildCount() - 1){
outRect.right = endSpace;
}
}

@Override
public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull State state) {
super.onDraw(c, parent, state);
}
}

差异工具
    public class MyDiffCallback extends DiffUtil.Callback{

List<Card> oldCards;
List<Card> newCards;
String TAG = "diffUtils";

public MyDiffCallback(List<Card> newCards, List<Card> oldCards) {
this.newCards = newCards;
this.oldCards = oldCards;
}

@Override
public int getOldListSize() {
return oldCards.size();
}

@Override
public int getNewListSize() {
return newCards.size();
}

@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
boolean areItemsTheSame = oldCards.get(oldItemPosition).getCardId() == newCards.get(newItemPosition).getCardId();
Log.d(TAG,"areItemsTheSame " + areItemsTheSame);
return oldCards.get(oldItemPosition).getCardId() == newCards.get(newItemPosition).getCardId();
}

@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
boolean areItemsTheSame = oldCards.get(oldItemPosition).equals(newCards.get(newItemPosition));
Log.d(TAG,"areContentsTheSame " + areItemsTheSame);
return oldCards.get(oldItemPosition).equals(newCards.get(newItemPosition));
}

@Nullable
@Override
public Object getChangePayload(int oldItemPosition, int newItemPosition) {
//you can return particular field for changed item.
Log.d(TAG,"getChangePayload ");
return super.getChangePayload(oldItemPosition, newItemPosition);
// return newCards.get(newItemPosition).getCardId();
}
}

从回收站 View 适配器 更新
public class CalculateDiffUtils extends AsyncTask<Void, Void, DiffUtil.DiffResult> {

private List<Card> oldCardList;
private List<Card> newCardList;

CalculateDiffUtils(List<Card> oldCardList, List<Card> newCardList) {
this.oldCardList = oldCardList;
this.newCardList = newCardList;
}

@Override
protected DiffUtil.DiffResult doInBackground(Void... params) {
return DiffUtil.calculateDiff(new MyDiffCallback(newCardList, oldCardList));
}

@Override
protected void onPostExecute(DiffUtil.DiffResult diffResult) {
super.onPostExecute(diffResult);
dispatchUpdates(diffResult, newCardList);

}
}




public void dispatchUpdates(DiffUtil.DiffResult diffResult, List<Card> newCardList){
this.cardList.clear();
this.cardList.addAll(newCardList);
diffResult.dispatchUpdatesTo(this);
}

最佳答案

我遇到了与您所描述的类似的问题,我发现这个正在寻找答案。

我不知道这个细节是否会影响你,但你正在使用 parent.getChildCount() - 1最后一个项目的位置。我最初使用的是 state.getItemCount() (减一),但这被证明是一个问题,因为我的列表改变了大小。我最终使用了 parent.getLayoutManager().getItemCount()方法(具有必要的空值检查和偏移量)。

不过,我注意到,在添加和删除项目以及更改列表大小时,DiffUtil 不会更新不需要重绘的项目,所以我实际上检查了项目是否已更改是我列表中的最后一个,然后调用 notifyItemChanged()在相邻的项目上。这将确保正确应用项目装饰。我在调用 diffResult.dispatchUpdatesTo(this) 后立即添加了此内容即notifyItemChanged(positionOfNewOrOldLastElement) .

关于android - 使用 diff utils 更新回收器 View 适配器,添加项目时无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56261748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com