From cdcf931e30005f3e7fc0f63bc0946ca61df8586a Mon Sep 17 00:00:00 2001 From: ikos13 Date: Sun, 31 Aug 2025 22:59:37 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BA=D0=BE=D1=80=D0=BE=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=87=D0=B8=D1=82=D1=81=D1=8F=20=D0=BB=D0=B5=D1=82=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (ПР№2 Спринт4 Косов И.А.) --- .../base/BaseListDiffCallback.java | 24 +++++++++ .../presentation/base/ListDiffInterface.java | 8 +++ .../filter/FilterContactTypeAdapter.java | 46 ++++++++++------- .../filter/model/FilterContactTypeUi.java | 9 +++- .../presentation/main/ContactAdapter.java | 47 +++++++++++------- .../contacts/presentation/main/ContactUi.java | 9 +++- .../presentation/sort/SortTypeAdapter.java | 49 +++++++++++-------- .../presentation/sort/SortTypeUI.java | 10 +++- 8 files changed, 140 insertions(+), 62 deletions(-) create mode 100644 app/src/main/java/ru/yandex/practicum/contacts/presentation/base/BaseListDiffCallback.java create mode 100644 app/src/main/java/ru/yandex/practicum/contacts/presentation/base/ListDiffInterface.java diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/base/BaseListDiffCallback.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/base/BaseListDiffCallback.java new file mode 100644 index 000000000..71d48dcd7 --- /dev/null +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/base/BaseListDiffCallback.java @@ -0,0 +1,24 @@ +package ru.yandex.practicum.contacts.presentation.base; +// import ru.yandex.practicum.contacts.presentation.base.ListDiffInterface; // Почему импорт интерфейса не нужен в этом дженерике? +import androidx.recyclerview.widget.DiffUtil; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class BaseListDiffCallback> extends DiffUtil.ItemCallback { + + @Override + public boolean areItemsTheSame(@NonNull T oldItem, @NonNull T newItem) { + return oldItem.theSameAs(newItem); + } + + @Override + public boolean areContentsTheSame(@NonNull T oldItem, @NonNull T newItem) { + return oldItem.equals(newItem); + } + + @Nullable + @Override + public Object getChangePayload(@NonNull T oldItem, @NonNull T newItem) { + return newItem; + } +} diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/base/ListDiffInterface.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/base/ListDiffInterface.java new file mode 100644 index 000000000..d37512214 --- /dev/null +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/base/ListDiffInterface.java @@ -0,0 +1,8 @@ +package ru.yandex.practicum.contacts.presentation.base; + +public interface ListDiffInterface { + boolean theSameAs(T elementTemp1); + + @Override + boolean equals(Object elementTemp1); +} diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/FilterContactTypeAdapter.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/FilterContactTypeAdapter.java index 4203bc297..599f9cb0e 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/FilterContactTypeAdapter.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/FilterContactTypeAdapter.java @@ -22,13 +22,21 @@ import ru.yandex.practicum.contacts.utils.model.ContactTypeUtils; import ru.yandex.practicum.contacts.utils.model.FilterContactTypeUtils; +import ru.yandex.practicum.contacts.presentation.base.BaseListDiffCallback; + + public class FilterContactTypeAdapter extends RecyclerView.Adapter { +// private final AsyncListDiffer differ = new AsyncListDiffer<>( +// new AdapterListUpdateCallback(this), +// new AsyncDifferConfig.Builder<>(new ListDiffCallback()).build() +// ); private final AsyncListDiffer differ = new AsyncListDiffer<>( new AdapterListUpdateCallback(this), - new AsyncDifferConfig.Builder<>(new ListDiffCallback()).build() + new AsyncDifferConfig.Builder<>(new BaseListDiffCallback()).build() ); + private final Consumer clickListener; public FilterContactTypeAdapter(Consumer clickListener) { @@ -86,22 +94,22 @@ public void bind(FilterContactTypeUi data) { } } - static class ListDiffCallback extends DiffUtil.ItemCallback { - - @Override - public boolean areItemsTheSame(@NonNull FilterContactTypeUi oldItem, @NonNull FilterContactTypeUi newItem) { - return oldItem.getContactType() == newItem.getContactType(); - } - - @Override - public boolean areContentsTheSame(@NonNull FilterContactTypeUi oldItem, @NonNull FilterContactTypeUi newItem) { - return oldItem.equals(newItem); - } - - @Nullable - @Override - public Object getChangePayload(@NonNull FilterContactTypeUi oldItem, @NonNull FilterContactTypeUi newItem) { - return newItem; - } - } +// static class ListDiffCallback extends DiffUtil.ItemCallback { +// +// @Override +// public boolean areItemsTheSame(@NonNull FilterContactTypeUi oldItem, @NonNull FilterContactTypeUi newItem) { +// return oldItem.getContactType() == newItem.getContactType(); +// } +// +// @Override +// public boolean areContentsTheSame(@NonNull FilterContactTypeUi oldItem, @NonNull FilterContactTypeUi newItem) { +// return oldItem.equals(newItem); +// } +// +// @Nullable +// @Override +// public Object getChangePayload(@NonNull FilterContactTypeUi oldItem, @NonNull FilterContactTypeUi newItem) { +// return newItem; +// } +// } } diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/model/FilterContactTypeUi.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/model/FilterContactTypeUi.java index fbb187fdf..2a0f5f53e 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/model/FilterContactTypeUi.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/model/FilterContactTypeUi.java @@ -2,7 +2,9 @@ import androidx.annotation.NonNull; -public class FilterContactTypeUi { +import ru.yandex.practicum.contacts.presentation.base.ListDiffInterface; + +public class FilterContactTypeUi implements ListDiffInterface { private final FilterContactType contactType; private final boolean selected; @@ -37,4 +39,9 @@ public int hashCode() { result = 31 * result + (selected ? 1 : 0); return result; } + @Override + public boolean theSameAs(FilterContactTypeUi elementTemp3) { + //return this.hashCode() == elementTemp3.hashCode(); // неправильно, здесь своя реализация + return this.getContactType() == elementTemp3.getContactType(); + } } diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactAdapter.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactAdapter.java index 9c2317248..627b1bf20 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactAdapter.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactAdapter.java @@ -24,13 +24,22 @@ import ru.yandex.practicum.contacts.R; import ru.yandex.practicum.contacts.databinding.ItemContactBinding; +import ru.yandex.practicum.contacts.presentation.base.BaseListDiffCallback; +// import ru.yandex.practicum.contacts.model.ContactUi; // ЭТО ЛИШНЕЕ, Будет ошибка!!! +//import ru.yandex.practicum.contacts.presentation.base.ListDiffInterface; // Не нужно, это в самом классе + public class ContactAdapter extends RecyclerView.Adapter { + //private final AsyncListDiffer differ = new AsyncListDiffer<>( + // new AdapterListUpdateCallback(this), + // new AsyncDifferConfig.Builder<>(new ListDiffCallback()).build() + //); private final AsyncListDiffer differ = new AsyncListDiffer<>( new AdapterListUpdateCallback(this), - new AsyncDifferConfig.Builder<>(new ListDiffCallback()).build() + new AsyncDifferConfig.Builder<>(new BaseListDiffCallback()).build() ); + @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -93,22 +102,22 @@ private void loadAvatar(ContactUi contact) { } } - static class ListDiffCallback extends DiffUtil.ItemCallback { - - @Override - public boolean areItemsTheSame(@NonNull ContactUi oldItem, @NonNull ContactUi newItem) { - return oldItem.hashCode() == newItem.hashCode(); - } - - @Override - public boolean areContentsTheSame(@NonNull ContactUi oldItem, @NonNull ContactUi newItem) { - return oldItem.equals(newItem); - } - - @Nullable - @Override - public Object getChangePayload(@NonNull ContactUi oldItem, @NonNull ContactUi newItem) { - return newItem; - } - } +// static class ListDiffCallback extends DiffUtil.ItemCallback { +// +// @Override +// public boolean areItemsTheSame(@NonNull ContactUi oldItem, @NonNull ContactUi newItem) { +// return oldItem.hashCode() == newItem.hashCode(); +// } +// +// @Override +// public boolean areContentsTheSame(@NonNull ContactUi oldItem, @NonNull ContactUi newItem) { +// return oldItem.equals(newItem); +// } +// +// @Nullable +// @Override +// public Object getChangePayload(@NonNull ContactUi oldItem, @NonNull ContactUi newItem) { +// return newItem; +// } +// } } diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactUi.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactUi.java index 4b2f216e8..c0d5175ca 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactUi.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactUi.java @@ -6,7 +6,10 @@ import ru.yandex.practicum.contacts.model.ContactType; -public class ContactUi { +import ru.yandex.practicum.contacts.presentation.base.ListDiffInterface; +//import ru.yandex.practicum.contacts.presentation.base.BaseListDiffCallback;// не нужно, это в адаптере + +public class ContactUi implements ListDiffInterface { private final String name; private final String phone; @@ -62,4 +65,8 @@ public int hashCode() { result = 31 * result + types.hashCode(); return result; } + @Override + public boolean theSameAs(ContactUi elementTemp2) { + return this.hashCode() == elementTemp2.hashCode(); + } } diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortTypeAdapter.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortTypeAdapter.java index fde5f59c8..1ea6e5ac1 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortTypeAdapter.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortTypeAdapter.java @@ -19,12 +19,19 @@ import ru.yandex.practicum.contacts.databinding.ItemSortBinding; import ru.yandex.practicum.contacts.presentation.sort.model.SortType; +import ru.yandex.practicum.contacts.presentation.base.BaseListDiffCallback; + + public class SortTypeAdapter extends RecyclerView.Adapter { +// private final AsyncListDiffer differ = new AsyncListDiffer<>( +// new AdapterListUpdateCallback(this), +// new AsyncDifferConfig.Builder<>(new ListDiffCallback()).build() +// ); private final AsyncListDiffer differ = new AsyncListDiffer<>( - new AdapterListUpdateCallback(this), - new AsyncDifferConfig.Builder<>(new ListDiffCallback()).build() - ); + new AdapterListUpdateCallback(this), + new AsyncDifferConfig.Builder<>(new BaseListDiffCallback()).build() +); private final Consumer clickListener; @@ -89,22 +96,22 @@ private int resource(SortType sortType) { } } - static class ListDiffCallback extends DiffUtil.ItemCallback { - - @Override - public boolean areItemsTheSame(@NonNull SortTypeUI oldItem, @NonNull SortTypeUI newItem) { - return oldItem.getSortType() == newItem.getSortType(); - } - - @Override - public boolean areContentsTheSame(@NonNull SortTypeUI oldItem, @NonNull SortTypeUI newItem) { - return oldItem.equals(newItem); - } - - @Nullable - @Override - public Object getChangePayload(@NonNull SortTypeUI oldItem, @NonNull SortTypeUI newItem) { - return newItem; - } - } +// static class ListDiffCallback extends DiffUtil.ItemCallback { +// +// @Override +// public boolean areItemsTheSame(@NonNull SortTypeUI oldItem, @NonNull SortTypeUI newItem) { +// return oldItem.getSortType() == newItem.getSortType(); +// } +// +// @Override +// public boolean areContentsTheSame(@NonNull SortTypeUI oldItem, @NonNull SortTypeUI newItem) { +// return oldItem.equals(newItem); +// } +// +// @Nullable +// @Override +// public Object getChangePayload(@NonNull SortTypeUI oldItem, @NonNull SortTypeUI newItem) { +// return newItem; +// } +// } } diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortTypeUI.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortTypeUI.java index eb71f27cd..9f6e48949 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortTypeUI.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortTypeUI.java @@ -4,7 +4,10 @@ import ru.yandex.practicum.contacts.presentation.sort.model.SortType; -public class SortTypeUI { +import ru.yandex.practicum.contacts.presentation.base.ListDiffInterface; + + +public class SortTypeUI implements ListDiffInterface { private final SortType sortType; private final boolean selected; @@ -39,4 +42,9 @@ public int hashCode() { result = 31 * result + (selected ? 1 : 0); return result; } + @Override + public boolean theSameAs(SortTypeUI elementTemp4) { + // return this.hashCode() == elementTemp4.hashCode(); // неправильно аналогично. НО! IDE ошибку не видит, компилирует + return this.getSortType() == elementTemp4.getSortType(); + } }