Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 09.05.2012
Сообщений: 19

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

30.09.2013, 04:11. Показов 3240. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.09.2013, 04:11
Ответы с готовыми решениями:

ListView Items
Имеется два простых вопроса относительно компонента ListView. Первый - как получать значения первого столбца ListView и записать в...

Добавление Items в Listview
Не получается добавить элементы в Listview. Задаю колонки и потом пытаюсь добавить элементы в цикле. ...

BackColor в listview.items
Добрый день. И так требуется в listview поменять фон элементов, да не просто поменять, а через один. Решил сделать подобным образом: ...

30
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.10.2013, 01:25
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Netscape Посмотреть сообщение
Это не одно и тоже.
ну и в чем разница для пользователя между первым и по последним вариантов если ImageView не имеет фона?

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

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

Добавлено через 4 минуты
Цитата Сообщение от ta4 Посмотреть сообщение
если не использовать imageView.setImageBitmap(null); то высота иногда рассчитывается не правильно если быстро скроллить список.
просто в setImageBitmap вызывается requestLayout() и invalidate(), попробуйте добавить к тем изменениям что я писал раньше еще imageView.requestLayout()
0
0 / 0 / 0
Регистрация: 09.05.2012
Сообщений: 19
01.10.2013, 01:51  [ТС]
Цитата Сообщение от 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
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.10.2013, 01:57
то если не использовать setTag то не мерцает? тогда можно попробовать вместо setTag например Map где ключом будет айтем, а значением holder.
0
0 / 0 / 0
Регистрация: 09.05.2012
Сообщений: 19
01.10.2013, 02:07  [ТС]
Цитата Сообщение от 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
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.10.2013, 02:22
поисследуйте чем таким отличается новый айтем от старого что это вызывает мерцание, подебагайте что в "Universal Image Loader" идет по другому. в чем-то же кроется причина.
0
0 / 0 / 0
Регистрация: 09.05.2012
Сообщений: 19
01.10.2013, 02:35  [ТС]
Цитата Сообщение от V0v1k Посмотреть сообщение
поисследуйте чем таким отличается новый айтем от старого что это вызывает мерцание, подебагайте что в "Universal Image Loader" идет по другому. в чем-то же кроется причина.
Использовал первую попавшуюся подобную библиотеку Picasso (http://square.github.io/picasso/). баг с мерцанием не наблюдается.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.10.2013, 02:35
Помогаю со студенческими работами здесь

ListView и нестандартные items
Всем привет! Коллеги, в Андройде ListView может быть присвоена собственная модель отображения (и конечно е получения) данных. А именно...

ListView items из xml файла
Доброго дня. Никто не сталкивался с сохранением данных для ListView в XML файле?? Есть туториал...

Удаление нескольких ListView.Items
Всем привет! Нужна помощь: Есть у меня ListView и ListBox, мне нужно удалить выбранные Items из ListView, и Items с такими же...

Добавить Items в ListView из файла
Здравствуйте, форумчане! У меня есть ListView и данные которые вносятся в него. В загрузке формы, читается файл с данными для ListView....

ListView, запись в переменную отмеченные Items
Здравствуйте уважаемые гуру программирования! Не подскажите (или если есть пример, указать направление куда капать) как записать...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru