ListView не обновляется

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

ListView не обновляется

Сообщение Mikhail_dev » 26 авг 2014, 12:24

(edit. решено (сам напортачил) )

Здравствуйте.

Я не могу обновить ListView, который использует BaseAdapter. В адаптере я меняю данные так:
[syntax=java5]
public void setData(String[] data) {

for (int i=0;i<data.length;++i) {
this.mData=null;
}
this.mData = null;
this.mData = data;
}
[/syntax]
Т.е. я зануляю старые данные с тем решением, что советуют тут http://stackoverflow.com/questions/1542 ... om-adapter
После смены данных, вызываю adapter.notifyDataSetChanged(); . Дальше смотрю в самом коде адаптера, данные успешно обрабатываются, т.е. обновленные данные как бы есть и в getView в коде выполняются правильно, НО НЕ ОБНОВЛЯЮТСЯ ИХ ПРЕДСТАВЛЕНИЯ на экране. Что за жесть такая?
Последний раз редактировалось Mikhail_dev 26 авг 2014, 12:51, всего редактировалось 1 раз.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: ListView не обновляется

Сообщение KamiSempai » 26 авг 2014, 12:45

То есть, в getView есть что-то вроде dataText.setText(mData[position]) но толку ноль?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

Re: ListView не обновляется

Сообщение Mikhail_dev » 26 авг 2014, 12:50

В getView уже сами данные используются. В адаптере просто есть метод смены данных. Я меняю данные и после вызываю notify.
Я нашел ошибку, она была логической. Довольно нетривиальная ошибка попалась, к тому же по реально счастливой случайности она как раз выпадает на то состояние, которое было до этого показано.
Т.е. изначально вьюшка была в состоянии "А", но я должен видеть состояние "Б". но я его не видел, потому как она начинала с "А", потом принимала состояние "Б" и ошибочно снова принимала состояние "А". И я думал что вьюшка не отрисовывается.

Mykola
Сообщения: 132
Зарегистрирован: 26 июл 2013, 12:06

Re: ListView не обновляется

Сообщение Mykola » 27 авг 2014, 14:21

Mikhail_dev писал(а):(edit. решено (сам напортачил) )
[syntax=java5]
public void setData(String[] data) {

for (int i=0;i<data.length;++i) {
this.mData=null;
}
this.mData = null;
this.mData = data;
}
[/syntax]


А зачем цикл?
GC - сам освободит.

Mykola
Сообщения: 132
Зарегистрирован: 26 июл 2013, 12:06

Re: ListView не обновляется

Сообщение Mykola » 27 авг 2014, 14:22

public void setData(String[] data) {

for (int i=0;i<data.length;++i) {
this.mData=data;
}
data = null;
}

так?

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: ListView не обновляется

Сообщение altwin » 27 авг 2014, 14:23

Mykola писал(а):
Mikhail_dev писал(а):(edit. решено (сам напортачил) )
[syntax=java5]
public void setData(String[] data) {

for (int i=0;i<data.length;++i) {
this.mData=null;
}
this.mData = null;
this.mData = data;
}
[/syntax]


А зачем цикл?
GC - сам освободит.

Дело в том, что мы пишем ПО для компутера, а не наоборот, соответсвенно освобождать надо тогда. когда нам надо, а не когда какой -то там GC решит не грамотный... ;)

Что происходит, когда mData содержащей свое значение присваивается новое?
Изображение

Mykola
Сообщения: 132
Зарегистрирован: 26 июл 2013, 12:06

Re: ListView не обновляется

Сообщение Mykola » 27 авг 2014, 14:31

altwin писал(а):
Mykola писал(а):
Mikhail_dev писал(а):(edit. решено (сам напортачил) )
[syntax=java5]
public void setData(String[] data) {

for (int i=0;i<data.length;++i) {
this.mData=null;
}
this.mData = null;
this.mData = data;
}
[/syntax]


А зачем цикл?
GC - сам освободит.

Дело в том, что мы пишем ПО для компутера, а не наоборот, соответсвенно освобождать надо тогда. когда нам надо, а не когда какой -то там GC решит не грамотный... ;)

Что происходит, когда mData содержащей свое значение присваивается новое?


Ага, еслиб val = null, не только ссылку грохал, но и память освобождал, так что (хотя есть смысл 3, или 5 проход GC), но форик думаю в даном случаи бяка))))

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: ListView не обновляется

Сообщение altwin » 27 авг 2014, 14:35

Mykola писал(а):
altwin писал(а):
Mykola писал(а):
Mikhail_dev писал(а):(edit. решено (сам напортачил) )
[syntax=java5]
public void setData(String[] data) {

for (int i=0;i<data.length;++i) {
this.mData=null;
}
this.mData = null;
this.mData = data;
}
[/syntax]


А зачем цикл?
GC - сам освободит.

Дело в том, что мы пишем ПО для компутера, а не наоборот, соответсвенно освобождать надо тогда. когда нам надо, а не когда какой -то там GC решит не грамотный... ;)

Что происходит, когда mData содержащей свое значение присваивается новое?


Ага, еслиб val = null, не только ссылку грохал, но и память освобождал, так что (хотя есть смысл 3, или 5 проход GC), но форик думаю в даном случаи бяка))))

ну это уже другой вопрос :) В любом случа Android ограничен в ресурсах и ссылки нужно прибивать, отсутсвие ссылки - это фактически команда сборщику на удаление. В противном случае он может оставить в памяти мусор. Да и деталей много, в python есть хорошее правило на этот случай - явное, лучше неявного. Поведение сборщика мусора, как и всего по сути не гаррантированно, особенно время выполнения, гаррантируется лишь вызов.
Изображение

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

Re: ListView не обновляется

Сообщение Mikhail_dev » 27 авг 2014, 14:40

но форик думаю в даном случаи бяка))))
Вы читали причину по той ссылке, что я указал? http://stackoverflow.com/questions/1542 ... om-adapter
GC освободит, если не найдет связей с объектом.

Mykola
Сообщения: 132
Зарегистрирован: 26 июл 2013, 12:06

Re: ListView не обновляется

Сообщение Mykola » 27 авг 2014, 14:44

если в масиве не мульйо елементов, думаю (эх, ладно уговорил) сойдет)))

Mykola
Сообщения: 132
Зарегистрирован: 26 июл 2013, 12:06

Re: ListView не обновляется

Сообщение Mykola » 27 авг 2014, 14:50

Mikhail_dev писал(а):
но форик думаю в даном случаи бяка))))
Вы читали причину по той ссылке, что я указал? http://stackoverflow.com/questions/1542 ... om-adapter
GC освободит, если не найдет связей с объектом.
this.mData = null; - этого достаточно, для того что бы gc удали элементы масива (масива как бы уже нет)))

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: ListView не обновляется

Сообщение altwin » 27 авг 2014, 14:59

Mykola писал(а):
Mikhail_dev писал(а):
но форик думаю в даном случаи бяка))))
Вы читали причину по той ссылке, что я указал? http://stackoverflow.com/questions/1542 ... om-adapter
GC освободит, если не найдет связей с объектом.
this.mData = null; - этого достаточно, для того что бы gc удали элементы масива (масива как бы уже нет)))
Я же говорю, цикл - это другой вопрос... :) но вот не знаю... я не уверен с тем, что будет если какие -то значения уже используются или еще используются кем -то где -то, потому мне больше нравится простое: Arrays.fill(myArray, null); Большой плюс в том, что раз мы заполняем массив существующий фиксированного размера, значит делаем это сознательно и когда он заполнен null -ами проще, иначе ведь массива не существует, т.е. добавляя элемент нужно создать массив из 1 елемента, потом создать из 2 и убить прошлый и т.д.. Это всеравно, что рекурсивно факториал считать... да работает, но....
Изображение

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

Re: ListView не обновляется

Сообщение Mikhail_dev » 27 авг 2014, 15:06

Mykola писал(а):
Mikhail_dev писал(а):
но форик думаю в даном случаи бяка))))
Вы читали причину по той ссылке, что я указал? http://stackoverflow.com/questions/1542 ... om-adapter
GC освободит, если не найдет связей с объектом.
this.mData = null; - этого достаточно, для того что бы gc удали элементы масива (масива как бы уже нет)))
Во-первых нифига не сойдет. Где гарантия что GC вызовется? Нету такой гарантии. Или Вы руководствуетесь "ну раньше он успевал"? Во-вторых, ответьте тогда мне на вопрос, почему по той ссылке что я дал, данная проблема имеет место быть. Почему элементы держатся? Я не копал, когда решал данную задачу, но данная проблема есть. Вы уж опровергайте тогда и ту вещь, на которую я указал.

Mykola
Сообщения: 132
Зарегистрирован: 26 июл 2013, 12:06

Re: ListView не обновляется

Сообщение Mykola » 27 авг 2014, 15:29

Почему элементы держатся?
Странно, что Вы не знаете. Причин может быть много, от CG - не успел "Или Вы руководствуетесь "ну раньше он успевал"", до есть обьект который держит ссылку на элемент списка.
Для интереса создайте масив с мульен null элементов и посмотрите размер (будете удивлены) ))

А Ваша проблема в том что супер клас хранит линку на ваш лист, и когда Вы делаете array = null, то супер хранит линку. В место этого делаю "перезатирание" старых элементов на новые.

Економия на строках, хм..., битмапы корень зла)))

П.С. "Приятно похоливарить с умными людьми, админ сори за офтоп))"

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

Re: ListView не обновляется

Сообщение Mikhail_dev » 27 авг 2014, 15:43

Странно, что Вы не знаете.
И вам спасибо на добром слове. Еще в чем обвините?
Причин может быть много, от CG - не успел "Или Вы руководствуетесь "ну раньше он успевал"", до есть обьект который держит ссылку на элемент списка.
Причин может быть мало:
1. GC не успел
2. GC не работает потому как его сломали
3. кто-то держит ссылку
4. данный объект статический и ссылка так просто не умирает (хотя в андроиде непредсказуемо)
Может какие-то другие причины знаете?
Для интереса создайте масив с мульен null элементов и посмотрите размер (будете удивлены) ))
Вы какие-то странные вещи говорите. Я не вижу связи. ну выделит он память под массив, ну будут они все нуловые. Что с того?
я тоже могу похоливарить "не в тему". А сколько элементов создастся тут ?
List list = new ArrayList();
А Ваша проблема в том что супер клас хранит линку на ваш лист, и когда Вы делаете array = null, то супер хранит линку. В место этого делаю "перезатирание" старых элементов на новые.
*леать! Твою дивизию! Вы можете ответить на вопрос, почему это не работает
public void updateReceiptsList(List<Receipt> newlist) {
receiptlist = newlist;
this.notifyDataSetChanged();
}
а это работает ?
public void updateReceiptsList(List<Receipt> newlist) {
receiptlist.clear();
receiptlist.addAll(newlist);
this.notifyDataSetChanged();
}
тут они тоже затерли в суперклассе. Зачем им явно чистить коллекцию?
Економия на строках, хм..., битмапы корень зла)))
На каких строках Экономия? Вы о чем вообще? Вы может отвечаете в другую тему? Я связи не уловлю, особенно когда какая-то всплывает экономия на строках, когда речь о массиве
П.С. "Приятно похоливарить с умными людьми, админ сори за офтоп))"
Вы холиварьте конкретикой, я не нострадамус

Mykola
Сообщения: 132
Зарегистрирован: 26 июл 2013, 12:06

Re: ListView не обновляется

Сообщение Mykola » 27 авг 2014, 16:02

public void updateReceiptsList(List<Receipt> newlist) {
receiptlist = newlist;
this.notifyDataSetChanged();
}

я и говорю, что в этом случаи в методе notifyDataSetChanged() он работает с листом super.receiptlist (или как он там обзываеться), там храниться ссылка на лист который вы передали в супер конструктор.
перепеши метод notifyDataSetChanged() и будет работать.

Все не буду писать больше, зой топикстартер, 2-й злой человак за сегодня.

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

Re: ListView не обновляется

Сообщение Mikhail_dev » 27 авг 2014, 16:13

там храниться ссылка на лист который вы передали в супер конструктор.
а, ну я понял, они не убивают ссылку, они просто заново заполняют коллекцию и обновляют данные. Я так понимаю курсор аналогично работает.
Все не буду писать больше, зой топикстартер, 2-й злой человак за сегодня.
Изображение

Mykola
Сообщения: 132
Зарегистрирован: 26 июл 2013, 12:06

Re: ListView не обновляется

Сообщение Mykola » 27 авг 2014, 16:16

*леать! Твою дивизию! ААА, какой про*б, в другой раз исправлюсь

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

Re: ListView не обновляется

Сообщение Mikhail_dev » 27 авг 2014, 16:20

Вы когда что-то подобное в фильме видите, тоже фильм выключаете?
Это вообще не к Вам относилось, это выражение такое, не более того.

Mykola
Сообщения: 132
Зарегистрирован: 26 июл 2013, 12:06

Re: ListView не обновляется

Сообщение Mykola » 27 авг 2014, 16:24

Mikhail_dev писал(а):Вы когда что-то подобное в фильме видите, тоже фильм выключаете?
Это вообще не к Вам относилось, это выражение такое, не более того.
Я матом тоже могу, сегодня настроение "ромашковое".
Славик го бухать

Ответить