From 45b83aef5a78f5c49382fd14b1e6f89c9e03189f Mon Sep 17 00:00:00 2001 From: Shagigalin Date: Tue, 13 May 2025 18:59:53 +0500 Subject: [PATCH 1/2] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D1=87?= =?UTF-8?q?=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=202=20=D0=BE=D1=82=2013.05.25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/BaseListDiffCallback.java | 23 +++++++++++++++++ .../presentation/base/ListDiffInterface.java | 11 ++++++++ .../filter/FilterContactTypeAdapter.java | 5 ++-- .../filter/model/FilterContactTypeUi.java | 11 ++++++-- .../presentation/main/ContactAdapter.java | 4 ++- .../contacts/presentation/main/ContactUi.java | 13 +++++++++- .../presentation/sort/SortDialogFragment.java | 2 +- .../presentation/sort/SortTypeAdapter.java | 25 ++++++++++--------- .../sort/{SortTypeUI.java => SortTypeUi.java} | 18 ++++++++++--- .../presentation/sort/SortViewModel.java | 10 ++++---- 10 files changed, 95 insertions(+), 27 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 rename app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/{SortTypeUI.java => SortTypeUi.java} (61%) 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..eca92a3d7 --- /dev/null +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/base/BaseListDiffCallback.java @@ -0,0 +1,23 @@ +package ru.yandex.practicum.contacts.presentation.base; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.DiffUtil; + +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..2b7e9d47e --- /dev/null +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/base/ListDiffInterface.java @@ -0,0 +1,11 @@ +package ru.yandex.practicum.contacts.presentation.base; + +import ru.yandex.practicum.contacts.presentation.filter.model.FilterContactTypeUi; + +public interface ListDiffInterface { + boolean theSameAs(FilterContactTypeUi other); + + boolean theSameAs(T other); + + boolean equals(Object other); +} 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..7a6a9a02c 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 @@ -17,6 +17,7 @@ import ru.yandex.practicum.contacts.databinding.ItemFilterBinding; import ru.yandex.practicum.contacts.model.ContactType; +import ru.yandex.practicum.contacts.presentation.base.BaseListDiffCallback; import ru.yandex.practicum.contacts.presentation.filter.model.FilterContactType; import ru.yandex.practicum.contacts.presentation.filter.model.FilterContactTypeUi; import ru.yandex.practicum.contacts.utils.model.ContactTypeUtils; @@ -26,7 +27,7 @@ public class FilterContactTypeAdapter extends RecyclerView.Adapter differ = new AsyncListDiffer<>( new AdapterListUpdateCallback(this), - new AsyncDifferConfig.Builder<>(new ListDiffCallback()).build() + new AsyncDifferConfig.Builder<>(new BaseListDiffCallback()).build() ); private final Consumer clickListener; @@ -86,7 +87,7 @@ public void bind(FilterContactTypeUi data) { } } - static class ListDiffCallback extends DiffUtil.ItemCallback { + static class BaseListDiffCallback extends DiffUtil.ItemCallback { @Override public boolean areItemsTheSame(@NonNull FilterContactTypeUi oldItem, @NonNull FilterContactTypeUi 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..ddac76fad 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; @@ -20,6 +22,11 @@ public boolean isSelected() { return selected; } + @Override + public boolean theSameAs(@NonNull FilterContactTypeUi other) { + return this.contactType == other.contactType; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -37,4 +44,4 @@ public int hashCode() { result = 31 * result + (selected ? 1 : 0); return result; } -} +} \ No newline at end of file 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..5c7705f9d 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 @@ -23,12 +23,14 @@ 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.presentation.main.ContactUi; public class ContactAdapter extends RecyclerView.Adapter { private final AsyncListDiffer differ = new AsyncListDiffer<>( new AdapterListUpdateCallback(this), - new AsyncDifferConfig.Builder<>(new ListDiffCallback()).build() + new AsyncDifferConfig.Builder<>(new BaseListDiffCallback()).build() ); @NonNull 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..0d5f11a8e 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 @@ -5,8 +5,10 @@ import java.util.List; import ru.yandex.practicum.contacts.model.ContactType; +import ru.yandex.practicum.contacts.presentation.base.ListDiffInterface; +import ru.yandex.practicum.contacts.presentation.filter.model.FilterContactTypeUi; -public class ContactUi { +public class ContactUi implements ListDiffInterface { private final String name; private final String phone; @@ -54,6 +56,11 @@ public boolean equals(Object o) { return types.equals(contact.types); } + @Override + public boolean theSameAs(FilterContactTypeUi other) { + return false; + } + @Override public int hashCode() { int result = name.hashCode(); @@ -62,4 +69,8 @@ public int hashCode() { result = 31 * result + types.hashCode(); return result; } + @Override + public boolean theSameAs(ContactUi other) { + return this.hashCode() == other.hashCode(); + } } diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortDialogFragment.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortDialogFragment.java index 06ac17cb7..f5ff9b26c 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortDialogFragment.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortDialogFragment.java @@ -46,7 +46,7 @@ private void iniViewModel() { viewModel.init(defaultSortType); } - private void updateSortTypes(List sortTypes) { + private void updateSortTypes(List sortTypes) { adapter.setItems(sortTypes); } 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..59d838880 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 @@ -17,18 +17,19 @@ import ru.yandex.practicum.contacts.R; import ru.yandex.practicum.contacts.databinding.ItemSortBinding; +import ru.yandex.practicum.contacts.presentation.base.BaseListDiffCallback; import ru.yandex.practicum.contacts.presentation.sort.model.SortType; public class SortTypeAdapter extends RecyclerView.Adapter { - private final AsyncListDiffer differ = new AsyncListDiffer<>( + 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; + private final Consumer clickListener; - public SortTypeAdapter(Consumer clickListener) { + public SortTypeAdapter(Consumer clickListener) { this.clickListener = clickListener; } @@ -50,7 +51,7 @@ public int getItemCount() { return differ.getCurrentList().size(); } - public void setItems(List items) { + public void setItems(List items) { differ.submitList(items); } @@ -58,15 +59,15 @@ static class ViewHolder extends RecyclerView.ViewHolder { private final ItemSortBinding binding; - private SortTypeUI data; + private SortTypeUi data; - public ViewHolder(@NonNull ItemSortBinding binding, Consumer clickListener) { + public ViewHolder(@NonNull ItemSortBinding binding, Consumer clickListener) { super(binding.getRoot()); this.binding = binding; this.binding.getRoot().setOnClickListener(v -> clickListener.accept(data)); } - public void bind(SortTypeUI data) { + public void bind(SortTypeUi data) { this.data = data; final int sortResId = resource(data.getSortType()); binding.text.setText(sortResId); @@ -89,21 +90,21 @@ private int resource(SortType sortType) { } } - static class ListDiffCallback extends DiffUtil.ItemCallback { + static class ListDiffCallback extends DiffUtil.ItemCallback { @Override - public boolean areItemsTheSame(@NonNull SortTypeUI oldItem, @NonNull SortTypeUI newItem) { + public boolean areItemsTheSame(@NonNull SortTypeUi oldItem, @NonNull SortTypeUi newItem) { return oldItem.getSortType() == newItem.getSortType(); } @Override - public boolean areContentsTheSame(@NonNull SortTypeUI oldItem, @NonNull SortTypeUI newItem) { + public boolean areContentsTheSame(@NonNull SortTypeUi oldItem, @NonNull SortTypeUi newItem) { return oldItem.equals(newItem); } @Nullable @Override - public Object getChangePayload(@NonNull SortTypeUI oldItem, @NonNull SortTypeUI newItem) { + 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 similarity index 61% rename from app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortTypeUI.java rename to app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortTypeUi.java index eb71f27cd..d85aa3764 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 @@ -2,14 +2,16 @@ import androidx.annotation.NonNull; +import ru.yandex.practicum.contacts.presentation.base.ListDiffInterface; +import ru.yandex.practicum.contacts.presentation.filter.model.FilterContactTypeUi; import ru.yandex.practicum.contacts.presentation.sort.model.SortType; -public class SortTypeUI { +public class SortTypeUi implements ListDiffInterface { private final SortType sortType; private final boolean selected; - public SortTypeUI(@NonNull SortType sortType, boolean selected) { + public SortTypeUi(@NonNull SortType sortType, boolean selected) { this.sortType = sortType; this.selected = selected; } @@ -27,12 +29,22 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - SortTypeUI that = (SortTypeUI) o; + SortTypeUi that = (SortTypeUi) o; if (selected != that.selected) return false; return sortType == that.sortType; } + @Override + public boolean theSameAs(FilterContactTypeUi other) { + return false; + } + + @Override + public boolean theSameAs(SortTypeUi other) { + return this.getSortType() == other.getSortType(); + } + @Override public int hashCode() { int result = sortType.hashCode(); diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortViewModel.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortViewModel.java index 1ce55fd6f..461555d9f 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortViewModel.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortViewModel.java @@ -14,7 +14,7 @@ public class SortViewModel extends BaseBottomSheetViewModel { private final UiState uiState = new UiState(); - private final MutableLiveData> sortTypesLiveDate = new MutableLiveData<>(); + private final MutableLiveData> sortTypesLiveDate = new MutableLiveData<>(); private final MutableLiveData uiStateLiveDate = new MutableLiveData<>(); private SortType defaultSortType; @@ -27,7 +27,7 @@ public void init(SortType defaultSortType) { updateUiState(); } - public void onSortTypeItemClick(SortTypeUI sortType) { + public void onSortTypeItemClick(SortTypeUi sortType) { selectedSortType = sortType.getSortType(); updateSortTypes(); updateUiState(); @@ -46,7 +46,7 @@ public void onResetClick() { updateUiState(); } - public MutableLiveData> getSortTypesLiveDate() { + public MutableLiveData> getSortTypesLiveDate() { return sortTypesLiveDate; } @@ -56,8 +56,8 @@ public MutableLiveData getUiStateLiveDate() { private void updateSortTypes() { final SortType[] sortTypes = SortType.values(); - final List sortTypesUi = Arrays.stream(sortTypes) - .map(sortType -> new SortTypeUI(sortType, Objects.equals(sortType, selectedSortType))) + final List sortTypesUi = Arrays.stream(sortTypes) + .map(sortType -> new SortTypeUi(sortType, Objects.equals(sortType, selectedSortType))) .collect(Collectors.toList()); sortTypesLiveDate.setValue(sortTypesUi); } From 30f11032387aae4402806fea9ee1ae3bdf973bad Mon Sep 17 00:00:00 2001 From: Shagigalin Date: Tue, 13 May 2025 21:39:44 +0500 Subject: [PATCH 2/2] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D1=87?= =?UTF-8?q?=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=202=20=D0=BE=D1=82=2013.05.25=20?= =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BE?= =?UTF-8?q?=D1=82=20sukhoikms27?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/base/ListDiffInterface.java | 4 +--- .../filter/FilterContactTypeAdapter.java | 22 +++---------------- .../contacts/presentation/main/ContactUi.java | 9 ++------ .../presentation/sort/SortTypeUi.java | 7 ++---- 4 files changed, 8 insertions(+), 34 deletions(-) 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 index 2b7e9d47e..00e379395 100644 --- 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 @@ -1,9 +1,7 @@ package ru.yandex.practicum.contacts.presentation.base; -import ru.yandex.practicum.contacts.presentation.filter.model.FilterContactTypeUi; - public interface ListDiffInterface { - boolean theSameAs(FilterContactTypeUi other); + boolean theSameAs(T other); 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 7a6a9a02c..1895528f0 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 @@ -5,11 +5,11 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; + import androidx.recyclerview.widget.AdapterListUpdateCallback; import androidx.recyclerview.widget.AsyncDifferConfig; import androidx.recyclerview.widget.AsyncListDiffer; -import androidx.recyclerview.widget.DiffUtil; + import androidx.recyclerview.widget.RecyclerView; import java.util.List; @@ -27,7 +27,7 @@ public class FilterContactTypeAdapter extends RecyclerView.Adapter differ = new AsyncListDiffer<>( new AdapterListUpdateCallback(this), - new AsyncDifferConfig.Builder<>(new BaseListDiffCallback()).build() + new AsyncDifferConfig.Builder<>(new BaseListDiffCallback()).build() ); private final Consumer clickListener; @@ -87,22 +87,6 @@ public void bind(FilterContactTypeUi data) { } } - static class BaseListDiffCallback 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/main/ContactUi.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactUi.java index 0d5f11a8e..6c681db69 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,7 @@ import ru.yandex.practicum.contacts.model.ContactType; import ru.yandex.practicum.contacts.presentation.base.ListDiffInterface; -import ru.yandex.practicum.contacts.presentation.filter.model.FilterContactTypeUi; + public class ContactUi implements ListDiffInterface { @@ -47,19 +47,14 @@ public List getTypes() { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - ContactUi contact = (ContactUi) o; - if (!name.equals(contact.name)) return false; if (!phone.equals(contact.phone)) return false; if (!photo.equals(contact.photo)) return false; return types.equals(contact.types); } - @Override - public boolean theSameAs(FilterContactTypeUi other) { - return false; - } + @Override public int hashCode() { 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 d85aa3764..1e64caaba 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 @@ -3,7 +3,7 @@ import androidx.annotation.NonNull; import ru.yandex.practicum.contacts.presentation.base.ListDiffInterface; -import ru.yandex.practicum.contacts.presentation.filter.model.FilterContactTypeUi; + import ru.yandex.practicum.contacts.presentation.sort.model.SortType; public class SortTypeUi implements ListDiffInterface { @@ -35,10 +35,7 @@ public boolean equals(Object o) { return sortType == that.sortType; } - @Override - public boolean theSameAs(FilterContactTypeUi other) { - return false; - } + @Override public boolean theSameAs(SortTypeUi other) {