ListView адаптер с разными view для разных элементов

Makute
Сообщения: 42
Зарегистрирован: 18 окт 2012, 15:16

ListView адаптер с разными view для разных элементов

Сообщение Makute » 18 окт 2012, 15:40

Задача нетривиальная и в интернете ничего схожего не нашел.
Есть несколько потоков, каждый из них загружает определенные данные, каждый поток - разные данные.
Есть listView, каждый поток в прогрессе работы должен динамически добавлять элемент, присущий именно этому потоку. Например: если это поток 1, то элемент листвью заполняется по разметке list_item_1.xml, если второй - list_item_second.xml и т.д., названия xml не принципальны, естественно.
Т.е. как заполнить listview динамически, разными по разметке(view) элементами и данными?
Как это сделано в официальном "vk" приложении, например.

Заранее спасибо.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: ListView адаптер с разными view для разных элементов

Сообщение rezak90 » 18 окт 2012, 15:46

в адаптере в методе getView() делать switch(ну или ифами).

Код: Выделить всё

View = view;
switch(id) {
case 1:
view = LayoutInflater.from(context).inflate(R.layout.one, null);
break;
case 2:
view = LayoutInflater.from(context).inflate(R.layout.two, null);
break;
//и т.д.
}
R.id.team
Политика на форуме запрещена

Makute
Сообщения: 42
Зарегистрирован: 18 окт 2012, 15:16

Re: ListView адаптер с разными view для разных элементов

Сообщение Makute » 18 окт 2012, 15:51

rezak90 писал(а):в адаптере в методе getView() делать switch(ну или ифами).

Код: Выделить всё

View = view;
switch(id) {
case 1:
view = LayoutInflater.from(context).inflate(R.layout.one, null);
break;
case 2:
view = LayoutInflater.from(context).inflate(R.layout.two, null);
break;
//и т.д.
}
К сожалению такой вариант не подойдет, т.к. заранее я не знаю, сколько и каких будет элементов.
Есть ли более динамически-настраиваемый вариант?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: ListView адаптер с разными view для разных элементов

Сообщение rezak90 » 18 окт 2012, 15:53

элементов в layout'e или же количество самих layout'ов?
R.id.team
Политика на форуме запрещена

Makute
Сообщения: 42
Зарегистрирован: 18 окт 2012, 15:16

Re: ListView адаптер с разными view для разных элементов

Сообщение Makute » 18 окт 2012, 15:56

rezak90 писал(а):элементов в layout'e или же количество самих layout'ов?
Мало того, что я не знаю сколько всего элементов будет(динамическое добавление элементов), так я не знаю так же, сколько элементов, соответствующих list_item_1.xml будет, сколько для второго и т.д., это я выясняю после обработки полученной в потоке информации.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: ListView адаптер с разными view для разных элементов

Сообщение rezak90 » 18 окт 2012, 16:13

не понимаю всё так в чём проблема. Например имеем имеим пустой лейаут my_layout.xml в котором есть только LinearLayout, дальше в коде:

Код: Выделить всё

LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = vi.inflate(R.layout.my_layout, null); //это как бы базовая разметка
//далее на неё лепим любые вьюхи и сколько угодно
по LayoutParams урок есть, а в гугле уж полно примеров по динамическому созданию view компонентов
R.id.team
Политика на форуме запрещена

Makute
Сообщения: 42
Зарегистрирован: 18 окт 2012, 15:16

Re: ListView адаптер с разными view для разных элементов

Сообщение Makute » 18 окт 2012, 16:27

rezak90 писал(а):не понимаю всё так в чём проблема. Например имеем имеим пустой лейаут my_layout.xml в котором есть только LinearLayout, дальше в коде:

Код: Выделить всё

LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = vi.inflate(R.layout.my_layout, null); //это как бы базовая разметка
//далее на неё лепим любые вьюхи и сколько угодно
по LayoutParams урок есть, а в гугле уж полно примеров по динамическому созданию view компонентов
К сожалению вы меня не поняли.
Видели приложение вконтакте для андроид?
Видели там listView?
Элементы в листе - разные, создаются динамически, мне нужно реализовать то же самое.

Вот несколько иная формулировка:
Суть проблемы: как заполнить listview РАЗНЫМИ по разметке элементами? Допустим есть несколько потоков, каждый из них в промежуточных результатах выдает какую-то информацию, она добавляется в соответствующий массив и должен добавится View элемент, соответствующий именно этому массиву.
Пример: Есть 3 массива, weather, news и results, каждому соответствует разметка list_item1.xml, итем2 и итем3 соответственно. так же есть 3 потока, каждый из потоков заполняет определенный массив, в onProgressUpdate нужно добавить в массив итем с соответствующей разметкой и данными из нужного массива.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: ListView адаптер с разными view для разных элементов

Сообщение rezak90 » 18 окт 2012, 16:38

Может вы меня не поняли. По аналогии с вашим примером:
Создаётся класс "общий" у которого есть все поля weather, news и results, и самое главное поле enum type которое принимает один из типов. Создаётся список ArrayList<класс> который всовывается адаптеру. При добавлении какой либо инфы в список вызываем notyfiDataSetChanger() что бы обновить список. В это время вызывается getView() адаптера в котором и рисуется необходимые вам компонент, делаем getItem(position) и получаем объект класса у которого вытягиваем type и сравниваем, если это weather то делаем динамическую разметку (можно циклом, можно рекурсией) и т.д. Надеюсь мысль понятна.
R.id.team
Политика на форуме запрещена

Makute
Сообщения: 42
Зарегистрирован: 18 окт 2012, 15:16

Re: ListView адаптер с разными view для разных элементов

Сообщение Makute » 18 окт 2012, 16:42

rezak90 писал(а):Может вы меня не поняли. По аналогии с вашим примером:
Создаётся класс "общий" у которого есть все поля weather, news и results, и самое главное поле enum type которое принимает один из типов. Создаётся список ArrayList<класс> который всовывается адаптеру. При добавлении какой либо инфы в список вызываем notyfiDataSetChanger() что бы обновить список. В это время вызывается getView() адаптера в котором и рисуется необходимые вам компонент, делаем getItem(position) и получаем объект класса у которого вытягиваем type и сравниваем, если это weather то делаем динамическую разметку (можно циклом, можно рекурсией) и т.д. Надеюсь мысль понятна.
Да, пожалуй, это вариант, хоть и костыль.
А заполнение делать пермаментно из разных массивов, создавая кучу разных ArrayList обязательно, или есть более кошерные варианты? Т.е. добавляем данные в массив(например - weather - название массива), потом обновляем глобальный свитчер типа, потом уже обращаемся к адаптеру?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: ListView адаптер с разными view для разных элементов

Сообщение rezak90 » 18 окт 2012, 16:53

никаких массивов не нужно, ArrayList и есть один сплошной массив.
Разве что можно разбить для удобства написать базовый класс и три класса weather, news и results. Базовый имеет 4 поля (три листа класса) и поле тип. Сейчас покажу:

Код: Выделить всё

public class Base {
private ArrayList<Weather> weatherList;
private ArrayList<News> newsList;
private ArrayList<Result> resultList;
private int type;
}
//данные для адаптера
ArrayList<Base> baseList;
так будет чуть удобнее наверное
R.id.team
Политика на форуме запрещена

Makute
Сообщения: 42
Зарегистрирован: 18 окт 2012, 15:16

Re: ListView адаптер с разными view для разных элементов

Сообщение Makute » 18 окт 2012, 16:58

rezak90 писал(а):никаких массивов не нужно, ArrayList и есть один сплошной массив.
Разве что можно разбить для удобства написать базовый класс и три класса weather, news и results. Базовый имеет 4 поля (три листа класса) и поле тип. Сейчас покажу:

Код: Выделить всё

public class Base {
private ArrayList<Weather> weatherList;
private ArrayList<News> newsList;
private ArrayList<Result> resultList;
private int type;
}
//данные для адаптера
ArrayList<Base> baseList;
так будет чуть удобнее наверное
Хорошо, спасибо.
Скажите, можно ли переопределить какой-либо из методов адаптера, чтобы при добавлении сразу указывать тип элемента? Если да - какой именно?
И как, собственно, динамически добавлять итемы в адаптер, если он уже присвоен какому-то листу?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: ListView адаптер с разными view для разных элементов

Сообщение rezak90 » 18 окт 2012, 17:01

Скажите, можно ли переопределить какой-либо из методов адаптера, чтобы при добавлении сразу указывать тип элемента? Если да - какой именно?
Зачем? в листе устанавливаем type, в getView() сравниваем type.
И как, собственно, динамически добавлять итемы в адаптер, если он уже присвоен какому-то листу?
Вот этого не понял.
R.id.team
Политика на форуме запрещена

Makute
Сообщения: 42
Зарегистрирован: 18 окт 2012, 15:16

Re: ListView адаптер с разными view для разных элементов

Сообщение Makute » 18 окт 2012, 17:05

rezak90 писал(а):
Скажите, можно ли переопределить какой-либо из методов адаптера, чтобы при добавлении сразу указывать тип элемента? Если да - какой именно?
Зачем? в листе устанавливаем type, в getView() сравниваем type.
И как, собственно, динамически добавлять итемы в адаптер, если он уже присвоен какому-то листу?
Вот этого не понял.
Есть адаптер, например MyAdapter
В нем есть элементы
Как добавлять в него элементы в ходе выполнения потока, например.
Что-то вроде метода addItem есть же?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: ListView адаптер с разными view для разных элементов

Сообщение rezak90 » 18 окт 2012, 17:08

элементы не в него добавляются а в лист, адаптер потом обновит лист сам или же если вы ему скажите notyfiDataSetChanger()
R.id.team
Политика на форуме запрещена

Makute
Сообщения: 42
Зарегистрирован: 18 окт 2012, 15:16

Re: ListView адаптер с разными view для разных элементов

Сообщение Makute » 18 окт 2012, 17:10

rezak90 писал(а):элементы не в него добавляются а в лист, адаптер потом обновит лист сам или же если вы ему скажите notyfiDataSetChanger()
Скорее всего я надоел уже вам, но не приведете ли пример?)

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: ListView адаптер с разными view для разных элементов

Сообщение rezak90 » 18 окт 2012, 17:21

вы с кастомными адаптерами когда то работали?
http://developerlife.com/tutorials/?p=327
http://android.vexedlogic.com/2011/04/0 ... item-view/
R.id.team
Политика на форуме запрещена

Makute
Сообщения: 42
Зарегистрирован: 18 окт 2012, 15:16

Re: ListView адаптер с разными view для разных элементов

Сообщение Makute » 18 окт 2012, 17:23

rezak90 писал(а):вы с кастомными адаптерами когда то работали?
http://developerlife.com/tutorials/?p=327
http://android.vexedlogic.com/2011/04/0 ... item-view/
С кастомными - да, а вот с динамическим заполнением - нет.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: ListView адаптер с разными view для разных элементов

Сообщение rezak90 » 18 окт 2012, 17:30

так а разницы нету, это как вы реализуете динамику так она и будет. И примеров много:
https://www.google.com.ua/search?q=andr ... e&ie=UTF-8
R.id.team
Политика на форуме запрещена

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: ListView адаптер с разными view для разных элементов

Сообщение Finch » 18 окт 2012, 22:47

Makute всё просто как веник
у те6я есть ArrayList - это не массив, он динамичен, тоесть нет размерности строгой. Прим.

Код: Выделить всё

String[] a = new String[10];
Тут в примере сильно не разгонишься...а у те6я есть куда
Логика такая, подгружаешь, парсишь инфу в асинктаске, вызываешь ArrayList.add(Стринг и тд), до6авляешь инфу, когда всё закончится =) просто вызываешь ТвойAdapter.notifyDataSetChanged() и на6людаешь как в ListView всё красиво изменилось
CEO of a company R.id.team

Makute
Сообщения: 42
Зарегистрирован: 18 окт 2012, 15:16

Re: ListView адаптер с разными view для разных элементов

Сообщение Makute » 19 окт 2012, 17:26

Finch писал(а):Makute всё просто как веник
у те6я есть ArrayList - это не массив, он динамичен, тоесть нет размерности строгой. Прим.

Код: Выделить всё

String[] a = new String[10];
Тут в примере сильно не разгонишься...а у те6я есть куда
Логика такая, подгружаешь, парсишь инфу в асинктаске, вызываешь ArrayList.add(Стринг и тд), до6авляешь инфу, когда всё закончится =) просто вызываешь ТвойAdapter.notifyDataSetChanged() и на6людаешь как в ListView всё красиво изменилось
Т.е. добавляем данные в массив, из которого берем данные, а адаптеру лишь сообщаем, что пора бы обновиться?
И ещё, по первому топику можете что-либо сказать?)

Ответить