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

Неадекватное поведение адаптера ListView

28.05.2015, 20:18. Показов 712. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно есть кастом-адаптер. В него приходят два массива с данными. В dates находится даты в формате "29.05.15". В photos ссылки на фотографии в фотмате "/data/data/packege/1.jpg;/data/data/packege/2.jpg". Проблема в том, что вызов getView происходит девять раз подряд для каждого элемента списка. В начале подумал что ошибка в том, что в суперкалсс передается ArrayList вместо List. Исправил, но ничего не изменилось. Нигде адаптер не нотифицируется что бы вызывать такое поведение. Мистика какая то, Какие у кого есть идеи?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package ru.solkris.bodymetrics.adapters;
 
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
 
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
import ru.solkris.bodymetrics.ChangeProfileActivity;
import ru.solkris.bodymetrics.MainActivity;
import ru.solkris.bodymetrics.R;
import ru.solkris.bodymetrics.core.Core;
import ru.solkris.bodymetrics.fragments.FragmentStat;
 
public class ListGalleryAdapter extends ArrayAdapter<String> {
    private ArrayList<String> dates = new ArrayList<String>();
    private ArrayList<String> photos = new ArrayList<String>();
    private int resource;
    private Context context;       //Контекст активности
    private boolean anim = false;
    private ViewHolder holder;
    private ArrayList<String> bagCounter = new ArrayList<String>();
    public ListGalleryAdapter(Context context, int resource, ArrayList<String> dates, ArrayList<String> photos, boolean anim) {
        super(context, resource, dates);
 
        this.resource = resource;
        this.context = context;
        this.anim = anim;
        this.dates = dates;
        this.photos = photos;
 
        for (int i = 0; i < dates.size(); i++) {
            bagCounter.add("0");
        }
    }
 
    static class ViewHolder {
        TextView tvDate;
        LinearLayout lGallery;
    }
 
    @Override
    public String getItem(int position) {
        //return super.getItem(position);
        return dates.get(position);
    }
 
    @Override
    public int getPosition(String item) {
        return super.getPosition(item);
    }
 
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {       //Стандартный обработчик загрузки элемента
        holder = new ViewHolder();
        View v = convertView;
        LayoutInflater vi;
        vi = LayoutInflater.from(getContext());
 
        if (v == null) {
            v = vi.inflate(resource, null);
            holder.tvDate = (TextView) v.findViewById(R.id.tv_date_gallery);
            holder.lGallery = (LinearLayout) v.findViewById(R.id.lGallery);
            v.setTag(holder);
        } else {
            holder = (ViewHolder) v.getTag();
        }
 
        String[] photoList = null;
 
        photoList = photos.get(position).split(";");
 
            for (int i = 0; i < photoList.length; i++) {
 
                Uri uri = Uri.parse(photoList[i]);
                addImage(uri);
                holder.tvDate.setText(dates.get(position));
            }
 
        return v;
 
    }
 
    private void addImage(Uri uri) {
        Bitmap galleryPic = null;
        ImageView iv = new ImageView(context);
 
        galleryPic = BitmapFactory.decodeFile(uri.toString());
        galleryPic = Core.getInstance().resizeBitmap(galleryPic, Core.getInstance().dpToPx(100));
        iv.setImageBitmap(galleryPic);
        holder.lGallery.addView(iv);
        ViewGroup.LayoutParams params = iv.getLayoutParams();
        params.width = Core.getInstance().dpToPx(100);
        params.height = Core.getInstance().dpToPx(100);
        iv.setLayoutParams(params);
    }
 
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.05.2015, 20:18
Ответы с готовыми решениями:

Получить из ListView адаптера значение в OnItemClickListener
В OnItemClickListener передается заполненый адаптер и номер позиции. Как вытянуть из него значение объекта ? public void...

Не выводиться информация в ListView с использованием адаптера
У меня есть три класса:t_table, List_Time_Table, and TimeAdapter. Суть в том, что в TimeAdapter я создал и настроил свой адаптер: public...

С помощью адаптера добавить два xml-я в listView
Есть два .xml &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; ...

3
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
28.05.2015, 21:06
Вызов getView идёт-то один раз, а вот в каждом из них есть вот это неподобство

Java
1
2
3
4
5
6
7
8
9
10
String[] photoList = null;
 
        photoList = photos.get(position).split(";");
 
            for (int i = 0; i < photoList.length; i++) {
 
                Uri uri = Uri.parse(photoList[i]);
                addImage(uri);
                holder.tvDate.setText(dates.get(position));
            }
Что оно делает для каждого вызова и нах№я - вопрос открытый, мистический
0
19 / 19 / 2
Регистрация: 13.07.2012
Сообщений: 164
29.05.2015, 10:39  [ТС]
Armagedo, вызов getView идет не один раз, так как как Log.d("TICK", "OK"); размещенный в начале getView дает такой вывод:

05-29 07:16:36.324 4100-4100/ru.solkris.bodymetrics D/THICK﹕ OK
05-29 07:16:36.324 4100-4100/ru.solkris.bodymetrics D/THICK﹕ OK
05-29 07:16:36.324 4100-4100/ru.solkris.bodymetrics D/THICK﹕ OK
05-29 07:16:36.324 4100-4100/ru.solkris.bodymetrics D/THICK﹕ OK
05-29 07:16:36.324 4100-4100/ru.solkris.bodymetrics D/THICK﹕ OK
05-29 07:16:36.324 4100-4100/ru.solkris.bodymetrics D/THICK﹕ OK
05-29 07:16:36.324 4100-4100/ru.solkris.bodymetrics D/THICK﹕ OK
05-29 07:16:36.324 4100-4100/ru.solkris.bodymetrics D/THICK﹕ OK
05-29 07:16:36.325 4100-4100/ru.solkris.bodymetrics D/THICK﹕ OK

Касаемо цикла, он там находился ка времянка, сейчас адаптер причесан. Суть работы его в том, что на вход приходит дата и массив bitmap, Адаптер должен создать в LinearLayout элементов группу ImageView и разместить там эти Bitmapы.
Новый код :
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
public class ListGalleryAdapter extends ArrayAdapter<String> {
    private ArrayList<String> dates = new ArrayList<String>();
    private ArrayList<ArrayList<Bitmap>> images = new ArrayList<ArrayList<Bitmap>>();
    private int resource;
    private Context context;      
    private boolean anim = false;
    private ViewHolder holder;
 
    public ListGalleryAdapter(Context context, int resource, ArrayList<String> dates, ArrayList<ArrayList<Bitmap>> images, boolean anim) {
        super(context, resource, dates);
 
        this.resource = resource;
        this.context = context;
        this.anim = anim;
        this.dates = dates;
        this.images = images;
 
    }
 
    static class ViewHolder {
        TextView tvDate;
        LinearLayout lGallery;
    }
 
    @Override
    public String getItem(int position) {
        return dates.get(position);
    }
 
    @Override
    public int getPosition(String item) {
        return super.getPosition(item);
    }
 
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {       
        Log.d("THICK", "OK");
        holder = new ViewHolder();
        View v = convertView;
        LayoutInflater vi;
        vi = LayoutInflater.from(getContext());
 
        if (v == null) {
            v = vi.inflate(resource, null);
            holder.tvDate = (TextView) v.findViewById(R.id.tv_date_gallery);
            holder.lGallery = (LinearLayout) v.findViewById(R.id.lGallery);
            v.setTag(holder);
        } else {
            holder = (ViewHolder) v.getTag();
        }
 
        holder.tvDate.setText(dates.get(position));
        for (int i = 0; i < images.get(position).size(); i++) {
            addImage(images.get(position).get(i));
        }
        return v;
 
    }
 
    private void addImage(Bitmap bitmap) {
        ImageView iv = new ImageView(context);
        iv.setImageBitmap(bitmap);
        holder.lGallery.addView(iv);
        ViewGroup.LayoutParams params = iv.getLayoutParams();
        params.width = Core.getInstance().dpToPx(100);
        params.height = Core.getInstance().dpToPx(100);
        iv.setLayoutParams(params);
 
    }
 
}
Для меня так и остаются непонятными причины множественного вызова getView на каждом элементе. При этом я обратил внимание еще на тот факт, что некоторые ImageView не создаются. Может быть это свойство именно адаптеров, что в них нельзя создавать динамические компоненты? Потому я уже такое количество глюков с ними поел, типа постоянно расфокусированный EditTextов.

Добавлено через 10 минут
Все, нашел косяк через дебаг. После return v; происходит уход во внутренний exception класса view. Я конечно не уверен до конца, но предположение таково. Если мне не изменят память то динамическое создание компонентов gui идет на уровне вторичных потоков. И получается что на момент возврата из getView что то в разметке еще не создалось. Из-за этого происходит exeption и повторный вызов getView. И так происходит покуда все не пройдет правильно. Значит создавать динамическую разметку в адаптерах нельзя. Буду знать на будущее.
0
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
29.05.2015, 11:30
Есть подозрение что в xml для ListView стоит

XML
1
2
android:layout_width="wrap_content"
        android:layout_height="wrap_content"
Поставьте

XML
1
2
android:layout_width="match_parent"
android:layout_height="match_parent"
И проблема изчезнет. Если я правильно понял всю суть.

Цитата Сообщение от Serbis Посмотреть сообщение
Значит создавать динамическую разметку в адаптерах нельзя. Буду знать на будущее.
Можно!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.05.2015, 11:30
Помогаю со студенческими работами здесь

неадекватное поведение компилятора
ни как не могу понять почему в коде uint8_t espAT(char *sommomd) { prymtf(sommomd); // отключаем команду модему do { ...

Неадекватное поведение контейнеров
Здравствуйте. Разбираюсь с xaml, не могу понять почему контейнеры работают не так, как должны по описанию. 1. Сущность кнопки...

Неадекватное поведение браузеров
Доброго дня коллеги! Любой из браузеров некорректно отображает страницы, не прогружается с первого раза, приходится несколько раз обновлять...

Неадекватное поведение роутера
Когда я подключаю роутер в режима моста(bridge) через высокоскоростное подключение, все работает. А когда делаю не в режиме моста(bridge)...

Неадекватное поведение цикла
Предсавляю вашему вниманию код программы: #include &lt;iostream&gt; #include &lt;stdlib.h&gt; int main() { for (int i=1;...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru