Я использую утилиты diff для обновления моего вида рециркулятора (текущие данные из модели представления возвращают список), у меня есть оформление элемента, которое добавляет большое количество отступов к последнему элементу в списке, но поскольку утилиты diff обновляютПри правильном просмотре в рециркуляторе путем вызова notifyItemInserted, а не notifyDataSetChanged, украшение применяется только к последнему элементу ADDED, поэтому все мои элементы заканчиваются большим количеством отступов в конце, если я добавляю элемент в мое представление рециркулятора и набор данных уведомления вызова измененАдаптер перестраивает все элементы, и отступы добавляются только к последнему элементу (что я и хочу), также, если я добавляю один и тот же элемент дважды, он добавляет его перед последним добавленным, например, если у меня есть список 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();
}
}
обновлено с помощью адаптера вида переработчика
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);
}