2016-09-09 1 views
0

Я работаю над проектом, где мне нужно разобрать два разных api's и заполнить их в один ListView. Я создал два класса сеттера-геттера для хранения проанализированных данных.Заполняют два разных значения api в одиночном ListView

  1. CategoryDetails
  2. VideoItem

обоих классов имеет различные различные переменные. Теперь вот что я пытаюсь объединить.

private ArrayList<CategoryDetails> categoryDetailsArrayList = new ArrayList<>(); 
private ArrayList<VideoItem> mVideoItems = new ArrayList<>(); 

/** 
    * API parsing and other coding stuff 
    **/ 

categoryDetailsArrayList.addAll(mVideoItems); 
adapter = new Adapter(this, categoryDetailsArrayList) 

Когда я пытаюсь объединить их, я получаю сообщение об ошибке:

addall(java.util.collection extends java.lang.string) in arraylist cannot be applied to (java.util.arrayList)

+0

Почему бы вам не создать модель, содержащую оба параметра объекта? – Ricardo

+0

потому что оба arraylist имеют разные типы. –

+0

@RicardoBarroca, да, я тоже об этом думал, но я не уверен, так как хочу случайным образом отображать результаты в списке. Я хочу, чтобы я показывал видеоролик после 2 или 3 обычных сообщений. – Devraj

ответ

0

Насколько я могу видеть, взгляды на различные модели должны быть разные, не так ли?

Я сделал бы следующее.

1) создал интерфейс для ListViewItem:

public interface MyListViewItem {} 

2) реализован этот интерфейс в CategoryDetails и VideoItem, т.е.

public class CategoryDetails implements MyListViewItem {...} 

public class VideoItem implements MyListViewItem {...} 

3) создано ArrayAdapter<MyListViewItem>

4) прошел ArrayList<MyListViewItem>, который содержит ВСЕ предметы всех типов

5) последовала инструкция по созданию и использованию адаптера с несколькими типами моделей. Как показан here

код

Внутри адаптера, когда вы хотите получить доступ к некоторой информации от модели, вам нужно будет проверить имя класса, а затем приводится к соответствующему типу, то есть:

MyListViewItem item = getItem(position); 
if (item instanceof CategoryDetails) { 
    CategoryDetails details = (CategoryDetails) item; 
    // do stuff 
} else if (item instanceof VideoItem) {... //you got idea } 

Надеется, что это помогает

+0

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

+0

Я полностью понял класс адаптера, но эту часть интерфейса. – Devraj

+0

В адаптер вы можете пройти обычно один список (ArrayList). ArrayList может содержать только элементы одного типа. Поэтому он не может содержать одновременно CategoryDetails и VideoItem, если только эти элементы не реализуют один и тот же интерфейс (или расширяют один и тот же класс) – krossovochkin

Смежные вопросы