Страница 1 из 2
ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 15:40
Makute
Задача нетривиальная и в интернете ничего схожего не нашел.
Есть несколько потоков, каждый из них загружает определенные данные, каждый поток - разные данные.
Есть listView, каждый поток в прогрессе работы должен динамически добавлять элемент, присущий именно этому потоку. Например: если это поток 1, то элемент листвью заполняется по разметке list_item_1.xml, если второй - list_item_second.xml и т.д., названия xml не принципальны, естественно.
Т.е. как заполнить listview динамически, разными по разметке(view) элементами и данными?
Как это сделано в официальном "vk" приложении, например.
Заранее спасибо.
Re: ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 15:46
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;
//и т.д.
}
Re: ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 15:51
Makute
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;
//и т.д.
}
К сожалению такой вариант не подойдет, т.к. заранее я не знаю, сколько и каких будет элементов.
Есть ли более динамически-настраиваемый вариант?
Re: ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 15:53
rezak90
элементов в layout'e или же количество самих layout'ов?
Re: ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 15:56
Makute
rezak90 писал(а):элементов в layout'e или же количество самих layout'ов?
Мало того, что я не знаю сколько всего элементов будет(динамическое добавление элементов), так я не знаю так же, сколько элементов, соответствующих list_item_1.xml будет, сколько для второго и т.д., это я выясняю после обработки полученной в потоке информации.
Re: ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 16:13
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 компонентов
Re: ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 16:27
Makute
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 нужно добавить в массив итем с соответствующей разметкой и данными из нужного массива.
Re: ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 16:38
rezak90
Может вы меня не поняли. По аналогии с вашим примером:
Создаётся класс "общий" у которого есть все поля weather, news и results, и самое главное поле enum type которое принимает один из типов. Создаётся список ArrayList<класс> который всовывается адаптеру. При добавлении какой либо инфы в список вызываем notyfiDataSetChanger() что бы обновить список. В это время вызывается getView() адаптера в котором и рисуется необходимые вам компонент, делаем getItem(position) и получаем объект класса у которого вытягиваем type и сравниваем, если это weather то делаем динамическую разметку (можно циклом, можно рекурсией) и т.д. Надеюсь мысль понятна.
Re: ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 16:42
Makute
rezak90 писал(а):Может вы меня не поняли. По аналогии с вашим примером:
Создаётся класс "общий" у которого есть все поля weather, news и results, и самое главное поле enum type которое принимает один из типов. Создаётся список ArrayList<класс> который всовывается адаптеру. При добавлении какой либо инфы в список вызываем notyfiDataSetChanger() что бы обновить список. В это время вызывается getView() адаптера в котором и рисуется необходимые вам компонент, делаем getItem(position) и получаем объект класса у которого вытягиваем type и сравниваем, если это weather то делаем динамическую разметку (можно циклом, можно рекурсией) и т.д. Надеюсь мысль понятна.
Да, пожалуй, это вариант, хоть и костыль.
А заполнение делать пермаментно из разных массивов, создавая кучу разных ArrayList обязательно, или есть более кошерные варианты? Т.е. добавляем данные в массив(например - weather - название массива), потом обновляем глобальный свитчер типа, потом уже обращаемся к адаптеру?
Re: ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 16:53
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;
так будет чуть удобнее наверное
Re: ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 16:58
Makute
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;
так будет чуть удобнее наверное
Хорошо, спасибо.
Скажите, можно ли переопределить какой-либо из методов адаптера, чтобы при добавлении сразу указывать тип элемента? Если да - какой именно?
И как, собственно, динамически добавлять итемы в адаптер, если он уже присвоен какому-то листу?
Re: ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 17:01
rezak90
Скажите, можно ли переопределить какой-либо из методов адаптера, чтобы при добавлении сразу указывать тип элемента? Если да - какой именно?
Зачем? в листе устанавливаем type, в getView() сравниваем type.
И как, собственно, динамически добавлять итемы в адаптер, если он уже присвоен какому-то листу?
Вот этого не понял.
Re: ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 17:05
Makute
rezak90 писал(а):Скажите, можно ли переопределить какой-либо из методов адаптера, чтобы при добавлении сразу указывать тип элемента? Если да - какой именно?
Зачем? в листе устанавливаем type, в getView() сравниваем type.
И как, собственно, динамически добавлять итемы в адаптер, если он уже присвоен какому-то листу?
Вот этого не понял.
Есть адаптер, например MyAdapter
В нем есть элементы
Как добавлять в него элементы в ходе выполнения потока, например.
Что-то вроде метода addItem есть же?
Re: ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 17:08
rezak90
элементы не в него добавляются а в лист, адаптер потом обновит лист сам или же если вы ему скажите notyfiDataSetChanger()
Re: ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 17:10
Makute
rezak90 писал(а):элементы не в него добавляются а в лист, адаптер потом обновит лист сам или же если вы ему скажите notyfiDataSetChanger()
Скорее всего я надоел уже вам, но не приведете ли пример?)
Re: ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 17:21
rezak90
Re: ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 17:23
Makute
С кастомными - да, а вот с динамическим заполнением - нет.
Re: ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 17:30
rezak90
так а разницы нету, это как вы реализуете динамику так она и будет. И примеров много:
https://www.google.com.ua/search?q=andr ... e&ie=UTF-8
Re: ListView адаптер с разными view для разных элементов
Добавлено: 18 окт 2012, 22:47
Finch
Makute всё просто как веник
у те6я есть ArrayList - это не массив, он динамичен, тоесть нет размерности строгой. Прим.
Тут в примере сильно не разгонишься...а у те6я есть куда
Логика такая, подгружаешь, парсишь инфу в асинктаске, вызываешь
ArrayList.add(Стринг и тд), до6авляешь инфу, когда всё закончится =) просто вызываешь
ТвойAdapter.notifyDataSetChanged() и на6людаешь как в ListView всё красиво изменилось
Re: ListView адаптер с разными view для разных элементов
Добавлено: 19 окт 2012, 17:26
Makute
Finch писал(а):Makute всё просто как веник
у те6я есть ArrayList - это не массив, он динамичен, тоесть нет размерности строгой. Прим.
Тут в примере сильно не разгонишься...а у те6я есть куда
Логика такая, подгружаешь, парсишь инфу в асинктаске, вызываешь
ArrayList.add(Стринг и тд), до6авляешь инфу, когда всё закончится =) просто вызываешь
ТвойAdapter.notifyDataSetChanged() и на6людаешь как в ListView всё красиво изменилось
Т.е. добавляем данные в массив, из которого берем данные, а адаптеру лишь сообщаем, что пора бы обновиться?
И ещё, по первому топику можете что-либо сказать?)