Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Serbis
3 / 3 / 2
Регистрация: 13.07.2012
Сообщений: 123
#1

Неадекватное поведение адаптера ListView - Программирование Android

28.05.2015, 20:18. Просмотров 290. Ответов 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);
    }
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2015, 20:18     Неадекватное поведение адаптера ListView
Посмотрите здесь:

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

С помощью адаптера добавить два xml-я в listView - Программирование Android
Есть два .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; ...

Создание адаптера - Программирование Android
MySimpleArrayAdapter adapter = new MySimpleArrayAdapter( Spisok.this, productsList, ...

popUp из кастом адаптера - Программирование Android
Добрый день возник такой вопрос, у меня есть кастом адаптер и есть картинка... public class CustomListViewAdapter extends...

Обновление данных адаптера - Программирование Android
Здравствуйте. Помогите, кто сталкивался. Есть список, где в зависимости от значения свойства отображенного объекта подставляется лейаут: ...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
28.05.2015, 21:06     Неадекватное поведение адаптера ListView #2
Вызов 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));
            }
Что оно делает для каждого вызова и нах№я - вопрос открытый, мистический
Serbis
3 / 3 / 2
Регистрация: 13.07.2012
Сообщений: 123
29.05.2015, 10:39  [ТС]     Неадекватное поведение адаптера ListView #3
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. И так происходит покуда все не пройдет правильно. Значит создавать динамическую разметку в адаптерах нельзя. Буду знать на будущее.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2015, 11:30     Неадекватное поведение адаптера ListView
Еще ссылки по теме:

Обращение к каждому элементу Адаптера - Программирование Android
мне неужно обратиться к каждому элементу адаптера и изменить там TextView,но почему то изменяется только 1й элемент,какой бы номер позиции...

XML данные для адаптера - Программирование Android
Хотелось бы разобраться со сложными XML-данными. Необходимо забить в XML данные записной книжки. Каждый элемент должен содержать данные: ...

Вывод информации в Toast c Адаптера - Программирование Android
Здравствуйте. В программе реализован класс адаптера &quot;новостей&quot; - NewsAdapter наследуемый от BaseAdapter. При попытке вывести текст...

Достать массив из динамически созданного адаптера) - Программирование Android
Есть EditText, кнопка и ListView, по нажатию кнопки в список добавляется элемент с названием из EditText'a и вызывается рекурсивная...


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

Или воспользуйтесь поиском по форуму:
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
29.05.2015, 11:30     Неадекватное поведение адаптера ListView #4
Есть подозрение что в 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 Посмотреть сообщение
Значит создавать динамическую разметку в адаптерах нельзя. Буду знать на будущее.
Можно!
Yandex
Объявления
29.05.2015, 11:30     Неадекватное поведение адаптера ListView
Ответ Создать тему
Опции темы

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