В настоящее время я использую адаптер для возврата набора элементов в 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: извините, что так длинно, просто хотел объяснить, что мне в основном нужно, а именно цикл динамического сравнения, который выводит результат элементов с соответствующими заголовками (даже если списки имеют разный размер на основе разного количества элементов )
@DominikWuttke спасибо за ваш ответ. можете ли вы объяснить свой сценарий с кодом. так было бы легче понять. Я просто хочу сделать свой жестко закодированный код динамическим, но не могу понять, как это сделать, есть идеи?
Как вы сказали, mMyEventsList
происходит от mListResponseList
, тогда зачем вы проводите сравнение. Просто покажите все предметы, доступные в mMyEventsList
. @АнжелаХили
@sagarsuri он получен по частям по списку 1 и на самом деле не имеет всех элементов, которые мне нужно отображать в карточке. Скажем, в списке 1 есть изображение и другие атрибуты, а в списке 2 есть только заголовок и другой ненужный атрибут, и это две отдельные конечные точки, созданные на сервере, поэтому я не могу их изменить.
@Angela Heely Вы должны просто обновить свой адаптированный список новым списком.
второй список имеет только заголовок и другой атрибут, я хочу отображать элементы в первом списке (у которого есть заголовок, изображение и другие элементы, которые мне нужны), только если заголовок во втором и первом списках совпадают. как мне это сделать?
Попробуйте сравнить два списка и создать отфильтрованный список, которым вы сможете обновить свой адаптер.
код 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); } }
Это должно быть добавлено в качестве комментария. Не как ответ.
Вы сравниваете элемент 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 без сбоя?
Что такое repo.gettitle()? в вашем списке ответов нет чего-то вроде «mMyEventList.get(i).getTitle()». Вы пытаетесь перебрать неправильный список в своем примере кода
Я предполагаю, что " 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 на основе приведенной выше логики, где я застрял
если вы сравните mMyEventList.get(Position) с каждым элементом в списке ответов, а в списке ответов будет 7 элементов, а в списке событий 4 элемента. Он будет сравнивать элемент 1 в списке событий с элементами от 1 до 7 в списке ответов, а также с элементами 2,3 и 4 списка событий. В вашем списке событий всего 4 элемента, и эта функция будет вызываться только для этих 4 элементов, поэтому вы используете позицию, полученную из onBind.
Я понимаю вашу ожидаемую логику. я внес изменения и разместил ответ, который действительно работает из вашего кода, в ваш ответ. Спасибо за помощь, это действительно помогло направить в правильном направлении. +25 для вас
любая идея об этом? : stackoverflow.com/questions/57598276/…
код Результаты 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); } }
можете ли вы объяснить в отношении моего кода. если есть прямой способ сделать это, кажется, что вышеуказанный подход может быть ненужным
вы проверяете, является ли элемент в позиции 1 в производном списке точно элементом в позиции 1 вашего исходного списка, но если ваш производный список содержит элементы 1,3 и 6 исходного списка, это будет работать только для элемента 1. Вам нужно чтобы проверить весь исходный список для каждого элемента в производном списке.