ListView адаптер с разными view для разных элементов
ListView адаптер с разными view для разных элементов
Задача нетривиальная и в интернете ничего схожего не нашел.
Есть несколько потоков, каждый из них загружает определенные данные, каждый поток - разные данные.
Есть listView, каждый поток в прогрессе работы должен динамически добавлять элемент, присущий именно этому потоку. Например: если это поток 1, то элемент листвью заполняется по разметке list_item_1.xml, если второй - list_item_second.xml и т.д., названия xml не принципальны, естественно.
Т.е. как заполнить listview динамически, разными по разметке(view) элементами и данными?
Как это сделано в официальном "vk" приложении, например.
Заранее спасибо.
Есть несколько потоков, каждый из них загружает определенные данные, каждый поток - разные данные.
Есть listView, каждый поток в прогрессе работы должен динамически добавлять элемент, присущий именно этому потоку. Например: если это поток 1, то элемент листвью заполняется по разметке list_item_1.xml, если второй - list_item_second.xml и т.д., названия xml не принципальны, естественно.
Т.е. как заполнить listview динамически, разными по разметке(view) элементами и данными?
Как это сделано в официальном "vk" приложении, например.
Заранее спасибо.
Re: ListView адаптер с разными view для разных элементов
в адаптере в методе 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
Политика на форуме запрещена
Политика на форуме запрещена
Re: ListView адаптер с разными view для разных элементов
К сожалению такой вариант не подойдет, т.к. заранее я не знаю, сколько и каких будет элементов.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 для разных элементов
элементов в layout'e или же количество самих layout'ов?
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: ListView адаптер с разными view для разных элементов
Мало того, что я не знаю сколько всего элементов будет(динамическое добавление элементов), так я не знаю так же, сколько элементов, соответствующих list_item_1.xml будет, сколько для второго и т.д., это я выясняю после обработки полученной в потоке информации.rezak90 писал(а):элементов в layout'e или же количество самих layout'ов?
Re: ListView адаптер с разными view для разных элементов
не понимаю всё так в чём проблема. Например имеем имеим пустой лейаут my_layout.xml в котором есть только LinearLayout, дальше в коде:
по LayoutParams урок есть, а в гугле уж полно примеров по динамическому созданию view компонентов
Код: Выделить всё
LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = vi.inflate(R.layout.my_layout, null); //это как бы базовая разметка
//далее на неё лепим любые вьюхи и сколько угодно
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: ListView адаптер с разными view для разных элементов
К сожалению вы меня не поняли.rezak90 писал(а):не понимаю всё так в чём проблема. Например имеем имеим пустой лейаут my_layout.xml в котором есть только LinearLayout, дальше в коде:по LayoutParams урок есть, а в гугле уж полно примеров по динамическому созданию view компонентовКод: Выделить всё
LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = vi.inflate(R.layout.my_layout, null); //это как бы базовая разметка //далее на неё лепим любые вьюхи и сколько угодно
Видели приложение вконтакте для андроид?
Видели там listView?
Элементы в листе - разные, создаются динамически, мне нужно реализовать то же самое.
Вот несколько иная формулировка:
Суть проблемы: как заполнить listview РАЗНЫМИ по разметке элементами? Допустим есть несколько потоков, каждый из них в промежуточных результатах выдает какую-то информацию, она добавляется в соответствующий массив и должен добавится View элемент, соответствующий именно этому массиву.
Пример: Есть 3 массива, weather, news и results, каждому соответствует разметка list_item1.xml, итем2 и итем3 соответственно. так же есть 3 потока, каждый из потоков заполняет определенный массив, в onProgressUpdate нужно добавить в массив итем с соответствующей разметкой и данными из нужного массива.
Re: ListView адаптер с разными view для разных элементов
Может вы меня не поняли. По аналогии с вашим примером:
Создаётся класс "общий" у которого есть все поля weather, news и results, и самое главное поле enum type которое принимает один из типов. Создаётся список ArrayList<класс> который всовывается адаптеру. При добавлении какой либо инфы в список вызываем notyfiDataSetChanger() что бы обновить список. В это время вызывается getView() адаптера в котором и рисуется необходимые вам компонент, делаем getItem(position) и получаем объект класса у которого вытягиваем type и сравниваем, если это weather то делаем динамическую разметку (можно циклом, можно рекурсией) и т.д. Надеюсь мысль понятна.
Создаётся класс "общий" у которого есть все поля weather, news и results, и самое главное поле enum type которое принимает один из типов. Создаётся список ArrayList<класс> который всовывается адаптеру. При добавлении какой либо инфы в список вызываем notyfiDataSetChanger() что бы обновить список. В это время вызывается getView() адаптера в котором и рисуется необходимые вам компонент, делаем getItem(position) и получаем объект класса у которого вытягиваем type и сравниваем, если это weather то делаем динамическую разметку (можно циклом, можно рекурсией) и т.д. Надеюсь мысль понятна.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: ListView адаптер с разными view для разных элементов
Да, пожалуй, это вариант, хоть и костыль.rezak90 писал(а):Может вы меня не поняли. По аналогии с вашим примером:
Создаётся класс "общий" у которого есть все поля weather, news и results, и самое главное поле enum type которое принимает один из типов. Создаётся список ArrayList<класс> который всовывается адаптеру. При добавлении какой либо инфы в список вызываем notyfiDataSetChanger() что бы обновить список. В это время вызывается getView() адаптера в котором и рисуется необходимые вам компонент, делаем getItem(position) и получаем объект класса у которого вытягиваем type и сравниваем, если это weather то делаем динамическую разметку (можно циклом, можно рекурсией) и т.д. Надеюсь мысль понятна.
А заполнение делать пермаментно из разных массивов, создавая кучу разных ArrayList обязательно, или есть более кошерные варианты? Т.е. добавляем данные в массив(например - weather - название массива), потом обновляем глобальный свитчер типа, потом уже обращаемся к адаптеру?
Re: ListView адаптер с разными view для разных элементов
никаких массивов не нужно, ArrayList и есть один сплошной массив.
Разве что можно разбить для удобства написать базовый класс и три класса weather, news и results. Базовый имеет 4 поля (три листа класса) и поле тип. Сейчас покажу:
так будет чуть удобнее наверное
Разве что можно разбить для удобства написать базовый класс и три класса 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
Политика на форуме запрещена
Политика на форуме запрещена
Re: ListView адаптер с разными view для разных элементов
Хорошо, спасибо.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 для разных элементов
Зачем? в листе устанавливаем type, в getView() сравниваем type.Скажите, можно ли переопределить какой-либо из методов адаптера, чтобы при добавлении сразу указывать тип элемента? Если да - какой именно?
Вот этого не понял.И как, собственно, динамически добавлять итемы в адаптер, если он уже присвоен какому-то листу?
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: ListView адаптер с разными view для разных элементов
Есть адаптер, например MyAdapterrezak90 писал(а):Зачем? в листе устанавливаем type, в getView() сравниваем type.Скажите, можно ли переопределить какой-либо из методов адаптера, чтобы при добавлении сразу указывать тип элемента? Если да - какой именно?Вот этого не понял.И как, собственно, динамически добавлять итемы в адаптер, если он уже присвоен какому-то листу?
В нем есть элементы
Как добавлять в него элементы в ходе выполнения потока, например.
Что-то вроде метода addItem есть же?
Re: ListView адаптер с разными view для разных элементов
элементы не в него добавляются а в лист, адаптер потом обновит лист сам или же если вы ему скажите notyfiDataSetChanger()
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: ListView адаптер с разными view для разных элементов
Скорее всего я надоел уже вам, но не приведете ли пример?)rezak90 писал(а):элементы не в него добавляются а в лист, адаптер потом обновит лист сам или же если вы ему скажите notyfiDataSetChanger()
Re: ListView адаптер с разными view для разных элементов
вы с кастомными адаптерами когда то работали?
http://developerlife.com/tutorials/?p=327
http://android.vexedlogic.com/2011/04/0 ... item-view/
http://developerlife.com/tutorials/?p=327
http://android.vexedlogic.com/2011/04/0 ... item-view/
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: ListView адаптер с разными view для разных элементов
С кастомными - да, а вот с динамическим заполнением - нет.rezak90 писал(а):вы с кастомными адаптерами когда то работали?
http://developerlife.com/tutorials/?p=327
http://android.vexedlogic.com/2011/04/0 ... item-view/
Re: ListView адаптер с разными view для разных элементов
так а разницы нету, это как вы реализуете динамику так она и будет. И примеров много:
https://www.google.com.ua/search?q=andr ... e&ie=UTF-8
https://www.google.com.ua/search?q=andr ... e&ie=UTF-8
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: ListView адаптер с разными view для разных элементов
Makute всё просто как веник
у те6я есть ArrayList - это не массив, он динамичен, тоесть нет размерности строгой. Прим. Тут в примере сильно не разгонишься...а у те6я есть куда
Логика такая, подгружаешь, парсишь инфу в асинктаске, вызываешь ArrayList.add(Стринг и тд), до6авляешь инфу, когда всё закончится =) просто вызываешь ТвойAdapter.notifyDataSetChanged() и на6людаешь как в ListView всё красиво изменилось
у те6я есть ArrayList - это не массив, он динамичен, тоесть нет размерности строгой. Прим.
Код: Выделить всё
String[] a = new String[10];
Логика такая, подгружаешь, парсишь инфу в асинктаске, вызываешь ArrayList.add(Стринг и тд), до6авляешь инфу, когда всё закончится =) просто вызываешь ТвойAdapter.notifyDataSetChanged() и на6людаешь как в ListView всё красиво изменилось
CEO of a company R.id.team
Re: ListView адаптер с разными view для разных элементов
Т.е. добавляем данные в массив, из которого берем данные, а адаптеру лишь сообщаем, что пора бы обновиться?Finch писал(а):Makute всё просто как веник
у те6я есть ArrayList - это не массив, он динамичен, тоесть нет размерности строгой. Прим.Тут в примере сильно не разгонишься...а у те6я есть кудаКод: Выделить всё
String[] a = new String[10];
Логика такая, подгружаешь, парсишь инфу в асинктаске, вызываешь ArrayList.add(Стринг и тд), до6авляешь инфу, когда всё закончится =) просто вызываешь ТвойAdapter.notifyDataSetChanged() и на6людаешь как в ListView всё красиво изменилось
И ещё, по первому топику можете что-либо сказать?)