Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
ta4
0 / 0 / 0
Регистрация: 09.05.2012
Сообщений: 19
#1

После вызова notifydataset() items в listview "моргают" - Программирование Android

30.09.2013, 04:11. Просмотров 1754. Ответов 30
Метки нет (Все метки)

столкнулся с такой проблемой, перерыл stackoverflow, ответа не нашел
есть список listview, который показывает картинки, загружая их из сети/кэша.
для него адаптер у которого есть функция getView()
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder vh;
        ImageView imageView;
        Image image = (Image)getItem(i);
        if (view==null)
        {
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.item, null);
            vh = new ViewHolder();
            vh.imageView = (ImageView) view.findViewById(R.id.imageView);
            view.setTag(vh);
        }
        vh = (ViewHolder)view.getTag();
        vh.i = i;
        imageView = vh.imageView;
        imageView.getLayoutParams().height = (int)getImageViewHeight(image.getHeight(),image.getWidth(),context.getResources().getDisplayMetrics().widthPixels, context.getResources().getDisplayMetrics().density);
 
        Log.e("SSS",String.valueOf(listView.getFirstVisiblePosition()+" "+i));
        imageView.setImageBitmap(null);
 
        imageLoader.displayImage(items.get(i).getLink(), imageView, options);
 
        return view;
чтобы добиться плавности прокрутки использую ViewHolder. После добавления новых элементов в список, вызываю notifydataset(). Все элементы в списке перерисовываются, соответственно картинки также перезагружаются (если картинка была в памяти, то она быстро перезагружается, но все же заметно, т.е. на долю секунды imageView становится пустым).
Если не использовать ViewHolder, то все нормально. Картинки которые пользователь сейчас видит не обновляются. Но при это производительность немного прокрутки списка падает.

Для загрузки картинок использую Universal Image Loader. Почти уверен что дело не в нем, т.к. пробовал обходиться и без него.
На всякий случай настроки UIL
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
options = new DisplayImageOptions.Builder()
                .cacheInMemory(true)
                .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
                .cacheOnDisc(true)     
                .build();
        config = new ImageLoaderConfiguration.Builder(contex
                .tasksProcessingOrder(QueueProcessingType.FIFO) 
                //.denyCacheImageMultipleSizesInMemory()
                .discCacheSize(3 * 1024 * 1024)
                .threadPriority(Thread.NORM_PRIORITY-1)
                .threadPoolSize(3) // default
                .memoryCacheSize(3 * 1024 * 1024)
                .writeDebugLogs()
                .build();
Не знаю куда копать уже даже....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2013, 04:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос После вызова notifydataset() items в listview "моргают" (Программирование Android):

Как определить "переадресованность" входящего вызова - Программирование Android
Доброго времени суток! Подскажите из какого свойства и каким образом можно получить признак "переадресованности" входящего вызова? В...

Как добавить строку "." в начале в ListView со своим обработчиком - Программирование Android
Я в своей базе данных, на каждый новый каталог, дополнительно добавляю запись со строкой "..", чтобы можно было переходить в верхний...

Ссылки (<a href="LINK">XXX</a>) внутри ListView - Программирование Android
Есть контент который я выкачиваю из интернета, и отображаю в листе. Контент располагается в объекте Spanned. В контенте могут быть ссылки,...

При прокрутке listview изображения подгружаются, но происходит "скачок" списка - Программирование Android
Здравствуйте. Использую listview и item с текстом и изображениями. При прокрутке listview изображения подгружаются, но происходит...

Работа с БД, связывание таблиц "фильмы", "жанры", "режиссеры" - Программирование Android
Ребят, всем привет! накидайте какие-нить идеи по реализации ситуация такая есть таблицы - &quot;списки_жанров&quot;, &quot;фильмы&quot;, &quot;режиссеры&quot; мне...

Ошибка "Unknown method "e" of "org.apache.commons.logging.Log" - Программирование Android
Unknown method 'e' of 'org.apache.commons.logging.Log' package com.mycompany.myapp; import android.widget.*; import...

30
Netscape
374 / 361 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
01.10.2013, 01:03 #16
Цитата Сообщение от V0v1k Посмотреть сообщение
зачем вообще высоту устанавливать в рантайме?
что бы "сжать" ImageView до высоты картинки. поскольку ImageView квадратная.
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.10.2013, 01:08 #17
Цитата Сообщение от ta4 Посмотреть сообщение
А если использовать фиксированную высоту, тогда у картинок различная ширина, что смотрится очень некрасиво
android:scaleType="centerCrop" разве не то же самое дает что вы пытаетесь сделать?
можно просто фон назначить для картинок, будет лучше смотреться.

Добавлено через 1 минуту
Цитата Сообщение от Netscape Посмотреть сообщение
что бы "сжать" ImageView до высоты картинки.
XML
1
android:scaleType="centerInside"
0
Netscape
374 / 361 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
01.10.2013, 01:09 #18
Похоже, это баг:
https://github.com/nostra13/Android-Universal-Image-Loader/issues/395

Попробуйте более старую версию, что ли. А то в последней много изменений, автор мог и накосячить где-то.
0
ta4
0 / 0 / 0
Регистрация: 09.05.2012
Сообщений: 19
01.10.2013, 01:18  [ТС] #19
Цитата Сообщение от Netscape Посмотреть сообщение
Похоже, это баг:
https://github.com/nostra13/Android-Universal-Image-Loader/issues/395

Попробуйте более старую версию, что ли. А то в последней много изменений, автор мог и накосячить где-то.
Пробовал решение описанное по ссылке, тоже не работало. попробую заменить UIL другой подобной библиотекой для теста (или старую версию uil, как вы советуете).
0
Netscape
374 / 361 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
01.10.2013, 01:19 #20
Цитата Сообщение от V0v1k Посмотреть сообщение
android:scaleType="centerInside"
Это не одно и тоже.
0
Миниатюры
После вызова notifydataset() items в listview "моргают"  
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.10.2013, 01:25 #21
Цитата Сообщение от Netscape Посмотреть сообщение
Это не одно и тоже.
ну и в чем разница для пользователя между первым и по последним вариантов если ImageView не имеет фона?

Добавлено через 30 секунд
или вам ни один из этих вариантов не подходит? тогда нарисуйте как должно быть.
0
ta4
0 / 0 / 0
Регистрация: 09.05.2012
Сообщений: 19
01.10.2013, 01:27  [ТС] #22
Цитата Сообщение от V0v1k Посмотреть сообщение
ну и в чем разница для пользователя между первым и по последним вариантов если ImageView не имеет фона?

Добавлено через 30 секунд
или вам ни один из этих вариантов не подходит? тогда нарисуйте как должно быть.
в первом варианте будут отступы большие между элементами в списке, в третьем отступов не будет
изображения идут одно за другим, отступы должны быть одинаковыми
0
Netscape
374 / 361 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
01.10.2013, 01:29 #23
Цитата Сообщение от V0v1k Посмотреть сообщение
ну и в чем разница для пользователя между первым и по последним вариантов если ImageView не имеет фона?
Высота item'a списка бессмысленно большая.
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.10.2013, 01:29 #24
то есть вы хотите чтобы айтемы списка были разной высоты?
0
ta4
0 / 0 / 0
Регистрация: 09.05.2012
Сообщений: 19
01.10.2013, 01:31  [ТС] #25
Цитата Сообщение от V0v1k Посмотреть сообщение
то есть вы хотите чтобы айтемы списка были разной высоты?
да, высота item должна зависеть от картинки, которая внутри item'a
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.10.2013, 01:38 #26
а, ну теперь стало понятно как оно должно выглядеть

Добавлено через 4 минуты
Цитата Сообщение от ta4 Посмотреть сообщение
если не использовать imageView.setImageBitmap(null); то высота иногда рассчитывается не правильно если быстро скроллить список.
просто в setImageBitmap вызывается requestLayout() и invalidate(), попробуйте добавить к тем изменениям что я писал раньше еще imageView.requestLayout()
0
ta4
0 / 0 / 0
Регистрация: 09.05.2012
Сообщений: 19
01.10.2013, 01:51  [ТС] #27
Цитата Сообщение от V0v1k Посмотреть сообщение
а, ну теперь стало понятно как оно должно выглядеть

Добавлено через 4 минуты

просто в setImageBitmap вызывается requestLayout() и invalidate(), попробуйте добавить к тем изменениям что я писал раньше еще imageView.requestLayout()
если заменить в getView
Java
1
 imageView.setImageBitmap (null)
на
Java
1
2
3
 
imageView.requestLayout();
imageView.invalidate();
и добавить опцию .resetViewBeforeLoading(true)
то размер считается правильно, но "мерцание" изображений в imageView осталось при вызове notifyDataSetChanged() (похоже это действительно баг).
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.10.2013, 01:57 #28
то если не использовать setTag то не мерцает? тогда можно попробовать вместо setTag например Map где ключом будет айтем, а значением holder.
0
ta4
0 / 0 / 0
Регистрация: 09.05.2012
Сообщений: 19
01.10.2013, 02:07  [ТС] #29
Цитата Сообщение от V0v1k Посмотреть сообщение
то если не использовать setTag то не мерцает? тогда можно попробовать вместо setTag например Map где ключом будет айтем, а значением holder.
вряд ли в setTag дело. дело в том, что если не использовать viewHolder (т.е. не использовать "старые" элементы списка для показа новых), но появляются небольшие лаги при прокрутке списка.
вот такой getView будет работать без мерцания
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public View getView(int i, View view, ViewGroup viewGroup)
{
    ViewHolder vh;
    ImageView imageView;
    Image image = (Image)getItem(i);
    //if (view==null)
    //{
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.item, null);
        vh = new ViewHolder();
        vh.imageView = (ImageView) view.findViewById(R.id.imageView);
        view.setTag(vh);
    //}
    //else
    //{
        vh = (ViewHolder)view.getTag();
    //}
    imageView = vh.imageView;
    imageView.getLayoutParams().height = (int)getImageViewHeight(image.getHeight(),image.getWidth(),context.getResources().getDisplayMetrics().widthPixels, context.getResources().getDisplayMetrics().density);
    imageView.setImageBitmap(null);
    imageLoader.displayImage(items.get(i).getLink(), imageView, options);
    return view;
}
каждый раз "раздувается" R.layout.item, и ищется imageView (view.findViewById(R.id.imageView), что приводит к небольшим лагам
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.10.2013, 02:22 #30
поисследуйте чем таким отличается новый айтем от старого что это вызывает мерцание, подебагайте что в "Universal Image Loader" идет по другому. в чем-то же кроется причина.
0
01.10.2013, 02:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2013, 02:22
Привет! Вот еще темы с ответами:

Баг с items при прокручивании ListView - Программирование Android
Суть такая, что выводится список ListView. Там items могут быть двух разных видов(ну тоесть два немного разных Layout) в зависимости от...

Отключить перескакивание между edittext после нажатия "готово" - Программирование Android
После нажатия на кнопку готово происходит заполнение второго edittext, третьего и.т.д. А нужно чтобы пользователь сам нажимал на нужные для...

Как программно убрать клавиатуру после нажатия кнопки "Далее"? - Программирование Android
Здравствуйте, уважаемые форумчане. Я недавно начал изучать android и столкнулся со следующей проблемой: я сделал поле ввода, и после ввода...

"Cannot resolve symbol R" после очистки проекта - Программирование Android
Был нормальный проект, но вот я решил его почистить. Почистил. Теперь у меня не проект, а консерва с гайками. Пишет мол Cannot resolve...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru