Категоризация в ListView

Интерфейс, диалоги, темы, стили, меню
Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Категоризация в ListView

Сообщение Mikhail_dev » 28 апр 2015, 11:26

новый адаптер не создается, Просто изменяется дата аррейлиста и вызывается нотифай
да? а что если данные типа "массив"? каким образом тогда там данные изменять? вот был у меня массив как данные, в адаптере, с 10 элементами, а новый пришел с 11. Как мне изменить данные?

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Категоризация в ListView

Сообщение doter.ua » 28 апр 2015, 11:44

Mikhail_dev писал(а):
новый адаптер не создается, Просто изменяется дата аррейлиста и вызывается нотифай
да? а что если данные типа "массив"? каким образом тогда там данные изменять? вот был у меня массив как данные, в адаптере, с 10 элементами, а новый пришел с 11. Как мне изменить данные?
В getView() ты получаешь item - элемент аррей листа, который используется при отрисовке вью. Как я понимаю при "нотифай" адаптер пробегает по своему аррейлисту отрисовывая с помощью getView(). Т.е. для обновления просто очищается старый лист:

list.clear();
list.addAll( newList );
...notifyDataSetChanged();
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Категоризация в ListView

Сообщение Mikhail_dev » 28 апр 2015, 12:03

Да причем тут ArrayList, когда я в конструктор передаю массив? Как его потом предлагаешь изменять? Как изменить final размер массива? И что если данные мне пришли в другой коллекции? Перезатирать, подставляя эти? Безумие.
С массивами точно не прокатит.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Категоризация в ListView

Сообщение doter.ua » 28 апр 2015, 12:14

Mikhail_dev писал(а):Да причем тут ArrayList, когда я в конструктор передаю массив? Как его потом предлагаешь изменять? Как изменить final размер массива? И что если данные мне пришли в другой коллекции? Перезатирать, подставляя эти? Безумие.
С массивами точно не прокатит.
Зачем тебе обычные массивы? использую динамические тот же аррей лист, перегоняй дату из массива в элементы коллекции. Для добавления новых элементов достаточно
сгенерить новый элемент и кинуть в конец листа.
list.add( new myItem( 1, "blabla", 123 ) ) ;
notify...
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Категоризация в ListView

Сообщение doter.ua » 28 апр 2015, 12:18

Вот еще пример перегона обычного массива в аррей, вполне нормальная практика.
http://stackoverflow.com/a/157950
Зачем подстраивать адаптер под массивы, когда можно массив подстроить(перегнать в коллекцию) под адаптер.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Категоризация в ListView

Сообщение Mikhail_dev » 28 апр 2015, 12:34

скажи мне, как я должен обновить данные, даже если он не массив, если у меня НОВЫЙ ArrayList с данными?Предлагаешь чистить первый и потом добавлять со второго все данные в первый?
edit я уже с этой темой связывался, там обычно начинаются некоторые сложности, такие как вот эти http://stackoverflow.com/a/20479071/4763961

А то что массивы нельзя использовать, это минус. В некоторых местах у меня массивы и я не хочу их менять с точки зрения оптимизации. Создание объекта всегда трудозатратная процедура

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Категоризация в ListView

Сообщение doter.ua » 28 апр 2015, 12:59

Mikhail_dev писал(а):скажи мне, как я должен обновить данные, даже если он не массив, если у меня НОВЫЙ ArrayList с данными?Предлагаешь чистить первый и потом добавлять со второго все данные в первый?
edit я уже с этой темой связывался, там обычно начинаются некоторые сложности, такие как вот эти http://stackoverflow.com/a/20479071/4763961

А то что массивы нельзя использовать, это минус. В некоторых местах у меня массивы и я не хочу их менять с точки зрения оптимизации. Создание объекта всегда трудозатратная процедура
Под reinitialize имеется в виду list = новыйЛист
Ответ был выше, да и в ссылке тоже:
лист.clear()
лист.addAll( newList )
notify..
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Категоризация в ListView

Сообщение doter.ua » 28 апр 2015, 13:05

Как вариант можно обновлять свойства(значения полей) старых объектов и когда один из массивов закончится удалять оставшиеся в старом, или добавлять в конец оставшиеся в новом.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Категоризация в ListView

Сообщение doter.ua » 28 апр 2015, 13:13

Еще можно попробовать хранить массив в адаптере и обращаться к нему по position. + ручное обновление. Тогда нужно придумать, что класть в аррейлист в конструткоре.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Категоризация в ListView

Сообщение Mikhail_dev » 28 апр 2015, 14:54

doter.ua писал(а):
Mikhail_dev писал(а):скажи мне, как я должен обновить данные, даже если он не массив, если у меня НОВЫЙ ArrayList с данными?Предлагаешь чистить первый и потом добавлять со второго все данные в первый?
edit я уже с этой темой связывался, там обычно начинаются некоторые сложности, такие как вот эти http://stackoverflow.com/a/20479071/4763961

А то что массивы нельзя использовать, это минус. В некоторых местах у меня массивы и я не хочу их менять с точки зрения оптимизации. Создание объекта всегда трудозатратная процедура
Под reinitialize имеется в виду list = новыйЛист
Ответ был выше, да и в ссылке тоже:
лист.clear()
лист.addAll( newList )
notify..
Это называется наплодить кучу новых объектов. Это очень плохой вариант. Ты вместо того, чтобы взять эти объекты, делаешь их клоны и суёшь в новый массив. и получится что там, где можно работать с уже готовыми объектами, ты будешь делать в два раза больше объектов. Не рекомендую им пользоваться (разве что тебе без разницы на батарею, нагрузку на ЦП и подобное, ну или данные редко обновляются)
doter.ua писал(а):Как вариант можно обновлять свойства(значения полей) старых объектов и когда один из массивов закончится удалять оставшиеся в старом, или добавлять в конец оставшиеся в новом.
Это не всегда получится. У меня к примеру межпроцессорное взаимодействие, и получение данных всегда является новым объектом, собранным из parcelable. И выбрасывать новые, готовые объекты, как-то неверно.
Еще можно попробовать хранить массив в адаптере и обращаться к нему по position.
И вот ты только что сказал, что делается в BaseAdapter! Переопределяешь наипростейшие методы, пишешь один метод сеттера и можешь как угодно изменять эти объекты (можно даже эксклюзивно взять LinkedHashMap и подобные), вызывая стандартный notifyDataChanged.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Категоризация в ListView

Сообщение doter.ua » 28 апр 2015, 16:37

Mikhail_dev писал(а): И вот ты только что сказал, что делается в BaseAdapter! Переопределяешь наипростейшие методы, пишешь один метод сеттера и можешь как угодно изменять эти объекты (можно даже эксклюзивно взять LinkedHashMap и подобные), вызывая стандартный notifyDataChanged.
Вопрос заключался в том, как обновить АррейАдаптер. У бейзАдаптера больше свободы, а у АррейАдаптера меньше кода.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Категоризация в ListView

Сообщение Mikhail_dev » 28 апр 2015, 16:46

Это не обновление ЭррейАдаптера, это извращение, потому что ты делаешь клон объектов.
лист.clear()
лист.addAll( newList )

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Категоризация в ListView

Сообщение doter.ua » 28 апр 2015, 17:27

Mikhail_dev писал(а):Это не обновление ЭррейАдаптера, это извращение, потому что ты делаешь клон объектов.
лист.clear()
лист.addAll( newList )
Не вижу смысла в ЛистВью и ему подобных с заоблачным кол-во элементов. Выводить инфу нужно уже отсортированной, юзер не будет скролить список из 10 000 элементов. Следовательно производительности для таких "нерациональных операций" должно хватать с головой.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Категоризация в ListView

Сообщение Mikhail_dev » 28 апр 2015, 17:43

Если не видно разницы, зачем плодить алгоритм который будет работать всегда медленнее, в два раза будет больше мусорить что негативно отразится на GC и батарее? А ведь GC - это блокировка UI потока со всеми вытекающими. Лень дописать ТРИ метода?
[syntax=java5]
@Override
public int getCount() {
return mData.size();
}

@Override
public ContactInfo getItem(int position) {
return mData.get(position);
}

@Override
public long getItemId(int position) {
return position;
}
[/syntax]

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Категоризация в ListView

Сообщение doter.ua » 28 апр 2015, 17:52

Mikhail_dev писал(а):Если не видно разницы, зачем плодить алгоритм который будет работать всегда медленнее, в два раза будет больше мусорить что негативно отразится на GC и батарее? А ведь GC - это блокировка UI потока со всеми вытекающими. Лень дописать ТРИ метода?
[syntax=java5]
@Override
public int getCount() {
return mData.size();
}

@Override
public ContactInfo getItem(int position) {
return mData.get(position);
}

@Override
public long getItemId(int position) {
return position;
}
[/syntax]
Не царское это дело - код оптимизировать.
Изображение
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Категоризация в ListView

Сообщение Foenix » 28 апр 2015, 18:56

:lol: doter.ua, та давно надо было сливаться с этой беседы
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Категоризация в ListView

Сообщение klblk » 29 апр 2015, 07:53

А ну раз тут начали говорить на такие темы. Столкнулся с проблемой обновления данных в списке. Точнее не то чтобы с проблемой, данные то обновляются, но думаю совсем не оптимально.
Суть: Из сервиса на ui приходит партия Parcelable объектов из которых составляется список. Обновлять их нужно раз в секунду (все изменения с объектами происходят в сервисе и часто, хотя некоторые объекты могут находиться в состоянии "покоя").
Собственно сейчас обновляется так (BaseAdapter):
[syntax=java5]public void update(ArrayList<MyParcelableObject> dataList) {
this.dataList = dataList;
notifyDataSetChanged();
}[/syntax]

На практике объектов не много (1-10), в теории не ограничено (но все равно вряд ли больше 100). ViewHolder имеется.
Собственно на чем стоит заморочиться, и так чтобы эти заморочки не были убыточнее текущей реализации?

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Категоризация в ListView

Сообщение Mikhail_dev » 29 апр 2015, 09:21

Ни над чем. У меня аналогичная модель работы, один в один. С сервиса уже приходят parcelable объекты. Если объекты уже есть, то не стоит больше с ними ничего делать, разве что отсортировать их. Если бы приходили данные для обновления в каком-нибудь JSON, то можно было бы оптимизировать, просто обновляя информацию, но если объект уже есть, то нечего и затрачивать ресурсы на обновление того, что уже имеется.
Оптимизировать тут можно то, чтобы данные не обновлялись тогда, когда ты не наблюдаешь в данный момент список. Ну я думаю это и так понятно.

Lucifer777
Сообщения: 122
Зарегистрирован: 18 ноя 2013, 17:53

Re: Категоризация в ListView

Сообщение Lucifer777 » 30 апр 2015, 11:19

Lucifer777 писал(а):
Foenix писал(а):кастомный листвью, где слева картинка, буква, меняющая свою видимость. Очень простенько.
не думал, что настолько простенько.

Попробовал так. Фигня получается, глючит.
Нужно, какой-то хитрый для listview footer написать.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Категоризация в ListView

Сообщение Foenix » 30 апр 2015, 11:43

значит сделал не так, у меня таких листвью полно - нигде не глючит ничего.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ответить