Как сравнить 2 списка с разным набором элементов в адаптере onBind()?

В настоящее время я использую адаптер для возврата набора элементов в 2 списках, например:

private List<ListResponse.Repo> mListResponseList;
private List<MyEvents.Event> mMyEventsList;

Теперь MyListResponse.Repo и MyEvents.Event дайте мне json-объекты с полным списком событий для первого (ListResponse.Repo), а некоторые выберите несколько событий для второго (MyEvents.Event)

В моем счетчике элементов для адаптера я возвращаю размер ListResponse.Repo следующим образом:

 @Override
    public int getItemCount() {
        if (mListResponseList != null && mListResponseList.size() > 0 ) {
            return mListResponseList.size();
        } else {
            return 1;
        }
    }

Обратите внимание: mListResponseList.size() — это список всех событий, поэтому обычно он возвращает все события в списке (скажем, 6), и если бы я использовал mMyEventsList.size, он всегда меньше или равен списку событий. элементы в mListResponseList, поскольку они практически получены оттуда (поскольку это конкретные события из основного списка, которые я получаю в другой конечной точке).

Теперь у меня возникла проблема, когда я пытаюсь отобразить только те события, в которых заголовок события в mMyEventsList совпадает с заголовком события, возвращаемым из mListResponseList. Единственная проблема заключается в том, что размер списка, возвращаемого всеми событиями, больше, чем размер списка, возвращаемого mMyEventsList, я обычно получаю исключение индекса за пределами границ, когда пытаюсь их сравнить. Я попытался использовать следующий код:

if (position < mMyEventsList.size()){

if (mMyEventsList.get(position).getEventTitle().equals(repo.getTitle())
     {
                    cardView.setVisibility(View.VISIBLE);

      }
}

но он не возвращает правильный результат, отображает только одну карту (вместо 3 или около того, исходя из совпадающих названий)

Следующая жестко закодированная строка работает для данного тестового сценария (где первый список имеет 8 элементов, а второй - 4), но она все еще жестко закодирована (если второй список должен возвращать более 4, это не будет работать), я хотел бы представить что-то динамическое (также убедившись, что приложение не аварийно завершает работу, если я сравниваю списки с разными размерами с исключением индекса вне границ), поскольку по мере изменения элементов списка содержимое также будет меняться.

Любая идея, как сделать следующее сравнение динамическим, чтобы оно возвращало ожидаемый результат, где оно сравнивает элементы в списке 1 с элементами в списке 2 и устанавливает представление карты для этого конкретного элемента как видимое, если заголовки совпадают, в противном случае он устанавливает видимость на пропало, если названия не совпадают. вот жестко закодированный код, который я использую на данный момент, просто хотел бы сделать его более динамичным, введя какой-то цикл, который будет работать для моего случая (до сих пор мне не повезло).

    public void onBind(int position) {
                super.onBind(position);
 if (mMyEventsList.get(0).getEventTitle().equals(repo.getTitle()) && mMyEventsList.get(0).getIsAttending() ||
                        mMyEventsList.get(1).getEventTitle().equals(repo.getTitle()) && mMyEventsList.get(1).getIsAttending() ||
                        mMyEventsList.get(2).getEventTitle().equals(repo.getTitle()) && mMyEventsList.get(2).getIsAttending() ||
                        mMyEventsList.get(3).getEventTitle().equals(repo.getTitle()) && mMyEventsList.get(3).getIsAttending()){
                    cardView.setVisibility(View.VISIBLE);
                } else {
                    cardView.setVisibility(View.GONE);
                }

}

Заранее спасибо! (ps: извините, что так длинно, просто хотел объяснить, что мне в основном нужно, а именно цикл динамического сравнения, который выводит результат элементов с соответствующими заголовками (даже если списки имеют разный размер на основе разного количества элементов )

вы проверяете, является ли элемент в позиции 1 в производном списке точно элементом в позиции 1 вашего исходного списка, но если ваш производный список содержит элементы 1,3 и 6 исходного списка, это будет работать только для элемента 1. Вам нужно чтобы проверить весь исходный список для каждого элемента в производном списке.

Dominik Wuttke 28.07.2019 02:57

@DominikWuttke спасибо за ваш ответ. можете ли вы объяснить свой сценарий с кодом. так было бы легче понять. Я просто хочу сделать свой жестко закодированный код динамическим, но не могу понять, как это сделать, есть идеи?

user11455292 28.07.2019 03:01

Как вы сказали, mMyEventsList происходит от mListResponseList, тогда зачем вы проводите сравнение. Просто покажите все предметы, доступные в mMyEventsList. @АнжелаХили

sagar suri 28.07.2019 05:21

@sagarsuri он получен по частям по списку 1 и на самом деле не имеет всех элементов, которые мне нужно отображать в карточке. Скажем, в списке 1 есть изображение и другие атрибуты, а в списке 2 есть только заголовок и другой ненужный атрибут, и это две отдельные конечные точки, созданные на сервере, поэтому я не могу их изменить.

user11455292 28.07.2019 13:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
528
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

@Angela Heely Вы должны просто обновить свой адаптированный список новым списком.

второй список имеет только заголовок и другой атрибут, я хочу отображать элементы в первом списке (у которого есть заголовок, изображение и другие элементы, которые мне нужны), только если заголовок во втором и первом списках совпадают. как мне это сделать?

user11455292 28.07.2019 02:59

Попробуйте сравнить два списка и создать отфильтрованный список, которым вы сможете обновить свой адаптер.

Saif Ben Fraj 28.07.2019 03:05

код ArrayList<Integer> results = new ArrayList<>(); // Элементы списка arrayList2 for (Person person2 : arrayList2) { // Элементы цикла arrayList1 boolean found = false; for (Person person1: arrayList1) { if (person2.id == person1.id) { found = true; } } если (!Найдено) { results.add(person2.id); } }

Saif Ben Fraj 28.07.2019 03:05

Это должно быть добавлено в качестве комментария. Не как ответ.

sagar suri 28.07.2019 05:15
Ответ принят как подходящий

Вы сравниваете элемент 1 из списка 1 с элементом 1 из списка 2. Элемент 2 с элементом 2 и так далее, если второй список является производным от первого и содержит, например, элементы 1,4 и 6. Элемент 1 списка 2 — это элемент 1 списка 1, а элемент 2 — это элемент 4, и они больше никогда не совпадут. Вам нужно сравнить каждый элемент списка 2 с каждым элементом списка 1. Например

public void onBind(int position) {
            super.onBind(position);
cardView.setVisibility(View.GONE);
for (int i = 0;i<mListResponseList;i++){
if (//Item from List 2 at Position 'Position' equals item on Position i of originallist){
cardView.setVisibility(View.VISIBLE);
break;
}

Вы в основном перебираете весь свой список 1 и проверяете, соответствует ли какой-либо элемент вашему элементу в списке 2, и если они равны, вы устанавливаете видимость карты, в противном случае она остается Gone, как определено onBind.

Модификация:

cardView.setVisibility(View.GONE);
            for (int i = 0;i<mMyEventsList.size();i++){
                if (mMyEventsList.get(i).getEventTitle().equals(repo.getTitle()) ) {
                    cardView.setVisibility(View.VISIBLE);
                    break;
                }
            }

поэтому для этой строки: "if (//Элемент из списка 2 в позиции "Позиция" равен элементу в позиции i исходного списка){" будет "mMyEventList.get(i).getTitle().equals(repo.gettitle( ))"? Кроме того, будет ли он сравнивать каждый элемент в списке 1 с каждым элементом в списке 2 без сбоя?

user11455292 28.07.2019 13:36

Что такое repo.gettitle()? в вашем списке ответов нет чего-то вроде «mMyEventList.get(i).getTitle()». Вы пытаетесь перебрать неправильный список в своем примере кода

Dominik Wuttke 28.07.2019 14:53

Я предполагаю, что " for (int i = 0;i<mListResponseList;i++){ вы имели в виду сравнение с mListResponseList.size. Проблема в том, что mListResponseList.size может быть, скажем, 7, а mMyEventist может иметь размер 4 , что означает если сравнение для position = 6 приведет к исключению индекса за пределами границ, так как mMyEventList.get(6).get title не существует или если вы ограничите его меньшим числом, где position < mMyEventlist.size() , он будет даже не сравнивайте элементы с более высокой позицией в mListResponseList с mMyEventList на основе приведенной выше логики, где я застрял

user11455292 28.07.2019 18:54

если вы сравните mMyEventList.get(Position) с каждым элементом в списке ответов, а в списке ответов будет 7 элементов, а в списке событий 4 элемента. Он будет сравнивать элемент 1 в списке событий с элементами от 1 до 7 в списке ответов, а также с элементами 2,3 и 4 списка событий. В вашем списке событий всего 4 элемента, и эта функция будет вызываться только для этих 4 элементов, поэтому вы используете позицию, полученную из onBind.

Dominik Wuttke 28.07.2019 23:26

Я понимаю вашу ожидаемую логику. я внес изменения и разместил ответ, который действительно работает из вашего кода, в ваш ответ. Спасибо за помощь, это действительно помогло направить в правильном направлении. +25 для вас

user11455292 28.07.2019 23:53

любая идея об этом? : stackoverflow.com/questions/57598276/…

user11455292 24.08.2019 05:01

код Результаты ArrayList = новый ArrayList<>(); // Элементы списка arrayList2 for (Person person2 : arrayList2) { // Элементы цикла arrayList1 boolean found = false; for (Person person1: arrayList1) { if (person2.id == person1.id) { found = true; } } если (!Найдено) { results.add(person2.id); } }

можете ли вы объяснить в отношении моего кода. если есть прямой способ сделать это, кажется, что вышеуказанный подход может быть ненужным

user11455292 28.07.2019 21:11

Другие вопросы по теме