ListView не обновляется
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
ListView не обновляется
(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 в коде выполняются правильно, НО НЕ ОБНОВЛЯЮТСЯ ИХ ПРЕДСТАВЛЕНИЯ на экране. Что за жесть такая?
Здравствуйте.
Я не могу обновить 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 не обновляется
То есть, в getView есть что-то вроде dataText.setText(mData[position]) но толку ноль?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: ListView не обновляется
В getView уже сами данные используются. В адаптере просто есть метод смены данных. Я меняю данные и после вызываю notify.
Я нашел ошибку, она была логической. Довольно нетривиальная ошибка попалась, к тому же по реально счастливой случайности она как раз выпадает на то состояние, которое было до этого показано.
Т.е. изначально вьюшка была в состоянии "А", но я должен видеть состояние "Б". но я его не видел, потому как она начинала с "А", потом принимала состояние "Б" и ошибочно снова принимала состояние "А". И я думал что вьюшка не отрисовывается.
Я нашел ошибку, она была логической. Довольно нетривиальная ошибка попалась, к тому же по реально счастливой случайности она как раз выпадает на то состояние, которое было до этого показано.
Т.е. изначально вьюшка была в состоянии "А", но я должен видеть состояние "Б". но я его не видел, потому как она начинала с "А", потом принимала состояние "Б" и ошибочно снова принимала состояние "А". И я думал что вьюшка не отрисовывается.
Re: ListView не обновляется
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 - сам освободит.
Re: ListView не обновляется
public void setData(String[] data) {
for (int i=0;i<data.length;++i) {
this.mData=data;
}
data = null;
}
так?
for (int i=0;i<data.length;++i) {
this.mData=data;
}
data = null;
}
так?
Re: ListView не обновляется
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 содержащей свое значение присваивается новое?
Re: ListView не обновляется
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), но форик думаю в даном случаи бяка))))
Re: ListView не обновляется
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 не обновляется
Вы читали причину по той ссылке, что я указал? http://stackoverflow.com/questions/1542 ... om-adapterно форик думаю в даном случаи бяка))))
GC освободит, если не найдет связей с объектом.
Re: ListView не обновляется
если в масиве не мульйо елементов, думаю (эх, ладно уговорил) сойдет)))
Re: ListView не обновляется
this.mData = null; - этого достаточно, для того что бы gc удали элементы масива (масива как бы уже нет)))Mikhail_dev писал(а):Вы читали причину по той ссылке, что я указал? http://stackoverflow.com/questions/1542 ... om-adapterно форик думаю в даном случаи бяка))))
GC освободит, если не найдет связей с объектом.
Re: ListView не обновляется
Я же говорю, цикл - это другой вопрос... но вот не знаю... я не уверен с тем, что будет если какие -то значения уже используются или еще используются кем -то где -то, потому мне больше нравится простое: Arrays.fill(myArray, null); Большой плюс в том, что раз мы заполняем массив существующий фиксированного размера, значит делаем это сознательно и когда он заполнен null -ами проще, иначе ведь массива не существует, т.е. добавляя элемент нужно создать массив из 1 елемента, потом создать из 2 и убить прошлый и т.д.. Это всеравно, что рекурсивно факториал считать... да работает, но....Mykola писал(а):this.mData = null; - этого достаточно, для того что бы gc удали элементы масива (масива как бы уже нет)))Mikhail_dev писал(а):Вы читали причину по той ссылке, что я указал? http://stackoverflow.com/questions/1542 ... om-adapterно форик думаю в даном случаи бяка))))
GC освободит, если не найдет связей с объектом.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: ListView не обновляется
Во-первых нифига не сойдет. Где гарантия что GC вызовется? Нету такой гарантии. Или Вы руководствуетесь "ну раньше он успевал"? Во-вторых, ответьте тогда мне на вопрос, почему по той ссылке что я дал, данная проблема имеет место быть. Почему элементы держатся? Я не копал, когда решал данную задачу, но данная проблема есть. Вы уж опровергайте тогда и ту вещь, на которую я указал.Mykola писал(а):this.mData = null; - этого достаточно, для того что бы gc удали элементы масива (масива как бы уже нет)))Mikhail_dev писал(а):Вы читали причину по той ссылке, что я указал? http://stackoverflow.com/questions/1542 ... om-adapterно форик думаю в даном случаи бяка))))
GC освободит, если не найдет связей с объектом.
Re: ListView не обновляется
Почему элементы держатся?
Странно, что Вы не знаете. Причин может быть много, от CG - не успел "Или Вы руководствуетесь "ну раньше он успевал"", до есть обьект который держит ссылку на элемент списка.
Для интереса создайте масив с мульен null элементов и посмотрите размер (будете удивлены) ))
А Ваша проблема в том что супер клас хранит линку на ваш лист, и когда Вы делаете array = null, то супер хранит линку. В место этого делаю "перезатирание" старых элементов на новые.
Економия на строках, хм..., битмапы корень зла)))
П.С. "Приятно похоливарить с умными людьми, админ сори за офтоп))"
Странно, что Вы не знаете. Причин может быть много, от CG - не успел "Или Вы руководствуетесь "ну раньше он успевал"", до есть обьект который держит ссылку на элемент списка.
Для интереса создайте масив с мульен null элементов и посмотрите размер (будете удивлены) ))
А Ваша проблема в том что супер клас хранит линку на ваш лист, и когда Вы делаете array = null, то супер хранит линку. В место этого делаю "перезатирание" старых элементов на новые.
Економия на строках, хм..., битмапы корень зла)))
П.С. "Приятно похоливарить с умными людьми, админ сори за офтоп))"
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: ListView не обновляется
И вам спасибо на добром слове. Еще в чем обвините?Странно, что Вы не знаете.
Причин может быть мало:Причин может быть много, от 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();
}
На каких строках Экономия? Вы о чем вообще? Вы может отвечаете в другую тему? Я связи не уловлю, особенно когда какая-то всплывает экономия на строках, когда речь о массивеЕкономия на строках, хм..., битмапы корень зла)))
Вы холиварьте конкретикой, я не нострадамусП.С. "Приятно похоливарить с умными людьми, админ сори за офтоп))"
Re: ListView не обновляется
public void updateReceiptsList(List<Receipt> newlist) {
receiptlist = newlist;
this.notifyDataSetChanged();
}
я и говорю, что в этом случаи в методе notifyDataSetChanged() он работает с листом super.receiptlist (или как он там обзываеться), там храниться ссылка на лист который вы передали в супер конструктор.
перепеши метод notifyDataSetChanged() и будет работать.
Все не буду писать больше, зой топикстартер, 2-й злой человак за сегодня.
receiptlist = newlist;
this.notifyDataSetChanged();
}
я и говорю, что в этом случаи в методе notifyDataSetChanged() он работает с листом super.receiptlist (или как он там обзываеться), там храниться ссылка на лист который вы передали в супер конструктор.
перепеши метод notifyDataSetChanged() и будет работать.
Все не буду писать больше, зой топикстартер, 2-й злой человак за сегодня.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: ListView не обновляется
а, ну я понял, они не убивают ссылку, они просто заново заполняют коллекцию и обновляют данные. Я так понимаю курсор аналогично работает.там храниться ссылка на лист который вы передали в супер конструктор.
Все не буду писать больше, зой топикстартер, 2-й злой человак за сегодня.
Re: ListView не обновляется
*леать! Твою дивизию! ААА, какой про*б, в другой раз исправлюсь
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: ListView не обновляется
Вы когда что-то подобное в фильме видите, тоже фильм выключаете?
Это вообще не к Вам относилось, это выражение такое, не более того.
Это вообще не к Вам относилось, это выражение такое, не более того.
Re: ListView не обновляется
Я матом тоже могу, сегодня настроение "ромашковое".Mikhail_dev писал(а):Вы когда что-то подобное в фильме видите, тоже фильм выключаете?
Это вообще не к Вам относилось, это выражение такое, не более того.
Славик го бухать