From 5da9b09f8e7608697040329918f781ad1992aac0 Mon Sep 17 00:00:00 2001 From: yan Date: Tue, 20 Dec 2022 19:00:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20N2.=20?= =?UTF-8?q?=D0=A6=D0=B0=D0=B1=D1=83=D1=82=20=D0=AF=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../practicum/contacts/model/ContactType.java | 3 +- .../base/BaseListDiffCallback.java | 26 ++++++++++++++ .../presentation/base/ListDiffInterface.java | 6 ++++ .../filter/FilterContactTypeAdapter.java | 36 +++++-------------- .../filter/FilterContactTypeViewModel.java | 14 +++++--- .../filter/model/FilterContactTypeUi.java | 12 ++++++- .../presentation/main/ContactAdapter.java | 33 +++++------------ .../contacts/presentation/main/ContactUi.java | 22 ++++++++---- .../presentation/sort/SortTypeAdapter.java | 24 ++----------- .../presentation/sort/SortTypeUI.java | 19 +++++++--- 10 files changed, 102 insertions(+), 93 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/model/ContactType.java b/app/src/main/java/ru/yandex/practicum/contacts/model/ContactType.java index 64462e9..8a39179 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/model/ContactType.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/model/ContactType.java @@ -11,6 +11,7 @@ public class ContactType { public static final String EMAIL = "email"; public static String[] getContactTypes() { - // метод должен возвращать массив строк, перечисленных выше + String[] contacts = {TELEGRAM, WHATS_APP, VIBER, SIGNAL, THREEMA, PHONE, EMAIL}; + return contacts; } } 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 0000000..4b6196f --- /dev/null +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/base/BaseListDiffCallback.java @@ -0,0 +1,26 @@ +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 { + public BaseListDiffCallback() { + super(); + } + @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 false; + } + + @Nullable + @Override + public Object getChangePayload(@NonNull T oldItem, @NonNull T newItem) { + return super.getChangePayload(oldItem, newItem); + } +} \ No newline at end of file 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 0000000..92da938 --- /dev/null +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/base/ListDiffInterface.java @@ -0,0 +1,6 @@ +package ru.yandex.practicum.contacts.presentation.base; + +public interface ListDiffInterface { + boolean theSameAs(ListDiffInterface listDiffInterface); + boolean equals(Object o); +} 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 99b9180..a899f83 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 @@ -4,28 +4,27 @@ import android.view.View; import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.AdapterListUpdateCallback; +import androidx.recyclerview.widget.AsyncDifferConfig; +import androidx.recyclerview.widget.AsyncListDiffer; +import androidx.recyclerview.widget.RecyclerView; + import java.util.List; import java.util.function.Consumer; import ru.yandex.practicum.contacts.databinding.ItemFilterBinding; +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; import ru.yandex.practicum.contacts.utils.model.FilterContactTypeUtils; -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; - public class FilterContactTypeAdapter extends RecyclerView.Adapter { 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; @@ -84,23 +83,4 @@ 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; - } - } } diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/FilterContactTypeViewModel.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/FilterContactTypeViewModel.java index 87af8c3..48c136a 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/FilterContactTypeViewModel.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/FilterContactTypeViewModel.java @@ -1,5 +1,6 @@ package ru.yandex.practicum.contacts.presentation.filter; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; @@ -60,13 +61,16 @@ public MutableLiveData getUiStateLiveDate() { } private void updateFilterContactTypes() { - // создайте массив строк. Для инициализации используйте метод ContactType.getContactTypes(), - // который должен возвращать список всех доступных источников контактов + String[] types = ContactType.getContactTypes(); - // создайте список типа FilterContactTypeUi и заполните его с помощью цикла forEach - // forEach должен бежать по строковому массиву, который вы создали ранее + ArrayList filterContactTypesUi = new ArrayList<>(); + filterContactTypesUi.add(createAllSelectedItem(types)); - // вызовите меотод setValue() у переменной filterContactTypesLiveDate и передайте в качестве аргументы ваш список типа FilterContactTypeUi + for (String type : types) { + filterContactTypesUi.add(createFilterContactType(type)); + } + + filterContactTypesLiveDate.setValue(filterContactTypesUi); } @NonNull 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 fbb187f..a7dcc49 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,12 @@ 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; @@ -21,6 +26,11 @@ public boolean isSelected() { } @Override + public boolean theSameAs(ListDiffInterface listDiffInterface) { + return this.getContactType() == ((FilterContactTypeUi) listDiffInterface).getContactType(); + } + + @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; 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 9c23172..356a12a 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 @@ -6,16 +6,15 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; - import androidx.annotation.NonNull; -import androidx.annotation.Nullable; + import androidx.core.content.ContextCompat; 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 com.bumptech.glide.Glide; import java.util.List; @@ -23,15 +22,16 @@ import ru.yandex.practicum.contacts.R; import ru.yandex.practicum.contacts.databinding.ItemContactBinding; +import ru.yandex.practicum.contacts.presentation.base.BaseListDiffCallback; 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 BaseListDiffCallback()).build() + ); - @NonNull + @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); @@ -93,22 +93,5 @@ 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; - } - } } 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 0e1d847..91899fc 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 @@ -3,21 +3,22 @@ import androidx.annotation.NonNull; import java.util.List; - +import java.lang.String; import ru.yandex.practicum.contacts.model.ContactType; +import ru.yandex.practicum.contacts.presentation.base.ListDiffInterface; -public class ContactUi { +public class ContactUi implements ListDiffInterface { private final String name; private final String phone; private final String photo; - private final List types; + private final List types; public ContactUi( @NonNull String name, @NonNull String phone, @NonNull String photo, - @NonNull List types + @NonNull List types ) { this.name = name; this.phone = phone; @@ -25,6 +26,8 @@ public ContactUi( this.types = types; } + + public String getName() { return name; } @@ -37,8 +40,15 @@ public String getPhoto() { return photo; } - public List getTypes() { - return types; + public List getTypes() { + return types; + } + + + + @Override + public boolean theSameAs(ListDiffInterface listDiffInterface) { + return this.hashCode() == ((ContactUi)listDiffInterface).hashCode(); } @Override 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 fde5f59..fde36c9 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 @@ -5,11 +5,9 @@ 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; @@ -17,13 +15,14 @@ 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<>( new AdapterListUpdateCallback(this), - new AsyncDifferConfig.Builder<>(new ListDiffCallback()).build() + new AsyncDifferConfig.Builder<>(new BaseListDiffCallback()).build() ); private final Consumer clickListener; @@ -88,23 +87,4 @@ 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; - } - } } 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 eb71f27..33b9d93 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,9 +2,13 @@ import androidx.annotation.NonNull; +import ru.yandex.practicum.contacts.presentation.base.ListDiffInterface; 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; @@ -14,15 +18,20 @@ public SortTypeUI(@NonNull SortType sortType, boolean selected) { this.selected = selected; } - public SortType getSortType() { - return sortType; - } + public SortType getSortType() { + return sortType; + } public boolean isSelected() { return selected; } - @Override + @Override + public boolean theSameAs(ListDiffInterface listDiffInterface) { + return this.getSortType() == ((SortTypeUI)listDiffInterface).getSortType(); + } + + @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false;