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

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

Войти
Регистрация
Восстановить пароль
 
 
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 128
#1

Баг с items при прокручивании ListView - Программирование Android

25.05.2015, 22:15. Просмотров 935. Ответов 38
Метки нет (Все метки)

Суть такая, что выводится список ListView. Там items могут быть двух разных видов(ну тоесть два немного разных Layout) в зависимости от данных которые выводятся. Когда все выводится то все хорошо, но если прокрутить в низ список так что бы пару пунктов списка спрятались то потом если прокрутить обратно то эти элементы могут поменять совй layout, на примем если в начале, в 1 элементе текст был с лева, а во втором с права, то потом они могут поменятся 1-текст с права, 2 - текст с лева (сам текст не меняется) .. Что это такое и как с этим боротся ?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2015, 22:15     Баг с items при прокручивании ListView
Посмотрите здесь:
Android ListView ошибка при прокручивании
Непонятный баг в ListView Android
Android После вызова notifydataset() items в listview "моргают"
Android ListView: сбивается содержимое ImageView элемента при скроллинге + как сделать выделение пункта списка при нажатии?
NullPointerException при поиске ListView Android
Android Цвет ListView при скролинге
Ошибка при инициализации ListView в ViewPager Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
26.05.2015, 00:11     Баг с items при прокручивании ListView #2
EgorDybovik, я тоже одно время с такой фигнёй мучался. Переопределяете свой адаптер? Покажите код. Используете там ViewHolder?
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
26.05.2015, 08:40     Баг с items при прокручивании ListView #3
Типичная проблема начинающих постигать ListView и адаптер. Помница я неделю бился с этой напастью. Короче надо все эти поля хранить и использовать в адаптере. Или ViewHolder использовать.
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 128
26.05.2015, 16:38  [ТС]     Баг с items при прокручивании ListView #4
Не использовал ViewHolder; попробовал использовать, вроде по отношению где какой должен быть теперь нормально, но теперь сами элементы путаются между собой и повтаряются некоторые при прокручивании ))) Это вообще весло )
Вот код, то что закоментировано было раньше до того как я сделал через ViewHolder
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
public View getView(int position, View convertView, ViewGroup parent) {
        mesageTemplate mesageTempl = null; 
        final MesageModel mesagemodel = objects.get(position);
        ViewHolder viewholder;
        if (convertView == null) {
 
            //LayoutInflater inflater = context.getLayoutInflater(); //mesagemodel.getVov().equals("0")
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
            if(mesagemodel.getVov().compareTo("1")==0){
                convertView = inflater.inflate(R.layout.friend_mesage_list, parent, false);
            } else {
                convertView = inflater.inflate(R.layout.my_mesage_list, parent, false);
            }
            
            viewholder = new ViewHolder();
            
            //TextView textMesage = (TextView) convertView.findViewById(R.id.textMesage);
            viewholder.mesageTExt = (TextView) convertView.findViewById(R.id.textMesage);
 
            //mesageTempl = new mesageTemplate(textMesage);
            viewholder.mesageTExt.setText(mesagemodel.getTextMesage());
            //convertView.setTag(mesageTempl);
            convertView.setTag(viewholder);
 
        } else {
            //mesageTempl = (mesageTemplate) convertView.getTag();
            viewholder = (ViewHolder) convertView.getTag();
        }
 
        
        //chatViewTemplate.setFio(chatModel.getFullName());
        //mesageTempl.setTextMesage(mesagemodel.getTextMesage());
 
        convertView.setOnClickListener(new OnClickListener() {
 
            @Override
            public void onClick(View v) {
                Toast.makeText(getContext(),mesagemodel.getVov() , Toast.LENGTH_SHORT).show();
                //Toast.makeText(getContext(),chatModel.getFriendId() , Toast.LENGTH_SHORT).show();
                //chatModel.getFriendId();
                //((Activity) context).startActivity(new Intent((((Activity) context)), MesageList.class));
            }
        });
 
        return convertView;
    }
Добавлено через 11 минут
Java
1
2
3
static class ViewHolder{
        public TextView mesageTExt;
    }
GukZiLLA
35 / 35 / 2
Регистрация: 30.11.2013
Сообщений: 102
26.05.2015, 17:48     Баг с items при прокручивании ListView #5
EgorDybovik, viewHolder переиспользует вьюхи и поэтому на новых item данные могут показываться из старых.

Чтобы такого не было, вынесите за пределы if вот это:
viewholder.mesageTExt.setText(mesagemodel.getTextMesage());

Чтобы каждый раз вбивалось заново

Добавлено через 2 минуты
EgorDybovik, Вообще в вашем случае не надо юзать viewHolder или использовать два viewHolder'a для своей mesage_list
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
26.05.2015, 21:32     Баг с items при прокручивании ListView #6
Вот мой адаптер
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ViewHolder {
    TextView text;
    int column1;
}
 
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    return inflater.inflate(R.layout.fragment_item, parent, false);
}
 
@Override
public void bindView(View view, Context context, Cursor cursor) {
    super.bindView(view, context, cursor);
    final long id = getItemId(cursor.getPosition());
    ViewHolder holder = (ViewHolder) view.getTag();
    if (holder == null) {
        holder = new ViewHolder();
        holder.text = (TextView) view.findViewById(R.id.text);
        view.setTag(holder);
    }
    holder.text.setText(cursor.getString(holder.column1));
...
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 128
27.05.2015, 20:13  [ТС]     Баг с items при прокручивании ListView #7
Цитата Сообщение от GukZiLLA Посмотреть сообщение
Вообще в вашем случае не надо юзать viewHolder или использовать два viewHolder'a для своей mesage_list
А что тогда использовать ?

Добавлено через 5 минут
Цитата Сообщение от Rube Посмотреть сообщение
Вот мой адаптер
Но у вас ведь тут не два layout для listview... для одного простого списка у меня тож все норм.
А вот что означает @Override ?? я все никак понять не могу, и для чего этот класс если он нигде не вызывается ?
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 653
27.05.2015, 20:49     Баг с items при прокручивании ListView #8
Аннотация @Override информирует компилятор о том, что метод перегружает метод в суперклассе.

Попробовал написать адаптер с использованием 2х itemView. Но тут не знаю как переиспользовать старые view-элементы. Наверное такой вариант ресурсозатратен, но по крайней мере работает.

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
public class ListAdapter extends BaseAdapter {
 
    Context context;
    LayoutInflater lInflater;
    int[] numbers;
 
    public ListAdapter(Context context, int[] numbers) {
        this.context = context;
        this.numbers = numbers;
        this.lInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
 
    @Override
    public int getCount() {
        return numbers.length;
    }
 
    @Override
    public Object getItem(int position) {
        return numbers[position];
    }
 
    @Override
    public long getItemId(int position) {
        return position;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        int element = (Integer) getItem(position);
        if(element % 2 == 0) {
            view = lInflater.inflate(R.layout.item1, parent, false);
        } else {
            view = lInflater.inflate(R.layout.item2, parent, false);
        }
        ((TextView) view.findViewById(R.id.textView)).setText("" + element);
 
        return view;
    }
}
И ещё попытался использовать ViewHolder. Попинайте код если не сложно.

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
public class ListAdapterWithViewHolder extends BaseAdapter {
 
    Context context;
    LayoutInflater lInflater;
    int[] numbers;
 
    public ListAdapterWithViewHolder(Context context, int[] numbers) {
        this.context = context;
        this.numbers = numbers;
        this.lInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
 
    @Override
    public int getCount() {
        return numbers.length;
    }
 
    @Override
    public Object getItem(int position) {
        return numbers[position];
    }
 
    @Override
    public long getItemId(int position) {
        return position;
    }
 
    static class ViewHolder {
        TextView holderTextView1;
        TextView holderTextView2;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
 
        View view;
        int element = (Integer) getItem(position);
        if(element % 2 == 0) {
            view = lInflater.inflate(R.layout.item11, parent, false);
            ViewHolder viewHolder = getHolder(view);
            if(viewHolder.holderTextView1 == null) {
                viewHolder.holderTextView1 = (TextView) view.findViewById(R.id.textView11);
            }
            viewHolder.holderTextView1.setText("" + element);
        } else {
            view = lInflater.inflate(R.layout.item22, parent, false);
            ViewHolder viewHolder = getHolder(view);
            if(viewHolder.holderTextView2 == null) {
                viewHolder.holderTextView2 = (TextView) view.findViewById(R.id.textView22);
            }
            viewHolder.holderTextView2.setText("" + element);
        }
        return view;
    }
 
    private ViewHolder getHolder(View view) {
        ViewHolder viewHolder = (ViewHolder) view.getTag();
        if(viewHolder == null) {
            viewHolder = new ViewHolder();
            view.setTag(viewHolder);
        }
        return viewHolder;
    }
}
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 128
27.05.2015, 21:08  [ТС]     Баг с items при прокручивании ListView #9
Цитата Сообщение от Rube Посмотреть сообщение
Вот мой адаптер
Но у вас ведь тут не два layout для listview... для одного простого списка у меня тож все норм.
А вот что означает @Override ?? я все никак понять не могу, и для чего этот класс если он нигде не вызывается ?
Цитата Сообщение от GukZiLLA Посмотреть сообщение
Чтобы такого не было, вынесите за пределы if вот это:
viewholder.mesageTExt.setText(mesagemodel.getTextMesage());
Не помогло (((

Добавлено через 10 минут
По сути я понимаю почему так просиходит, ведь из за перерысовки item при скроле, но как это исправить я не понимаю ... уже 5 дней мучаюсь ... Могу скинуть весь код с адаптером и моделью, может кто подскажет что изменить ?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
27.05.2015, 21:46     Баг с items при прокручивании ListView #10
EgorDybovik, да, выложите, а то я в потоке вашего и чужого кода уже запутался, что где и почему.
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
27.05.2015, 22:00     Баг с items при прокручивании ListView #11
Java
1
final MesageModel mesagemodel = objects.get(position);
Вот это надо в конструкторе, а не в getView.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
27.05.2015, 22:02     Баг с items при прокручивании ListView #12
EgorDybovik, не рассматривали вариант, что виноваты не контролы, а некоторые функции, написанные вами?
Это что за проверка?
Java
1
if(mesagemodel.getVov().compareTo("1")==0){
Здесь правильно выводит?
Java
1
mesagemodel.getTextMesage()
Вот мой вариант:
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
public class CustomAdapter extends BaseAdapter {
    private ArrayList<Item> items;
    private int layout;
    private LayoutInflater inflater;
 
    public CustomAdapter(Context context, int layout, ArrayList<Item> items) {
        super();
        this.items = items;
        this.layout = layout;
        inflater = LayoutInflater.from(context);
    }
 
    @Override
    public int getCount() {
        return items == null ? 0 : items.size();
    }
 
    @Override
    public Item getItem(int position) {
        return items == null ? null : items.get(position);
    }
 
    @Override
    public long getItemId(int position) {
        return position;
    }
 
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;
 
        if (convertView == null) {
            convertView = inflater.inflate(layout, null);
 
            viewHolder = new ViewHolder();
            viewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);
            viewHolder.tvDescription = (TextView) convertView.findViewById(R.id.tvDescription);
            viewHolder.tvDate = (TextView) convertView.findViewById(R.id.tvDate);
            convertView.setTag(viewHolder);
        } else
            viewHolder = (ViewHolder) convertView.getTag();
 
        final Item data = items.get(position);
        viewHolder.tvTitle.setText(data.title);
        viewHolder.tvDescription.setText(data.description);
        viewHolder.tvDate.setText(data.date);
 
        return convertView;
    }
 
    private static class ViewHolder {
        private TextView tvTitle;
        private TextView tvDescription;
        private TextView tvDate;
    }
}
Добавлено через 2 минуты
Цитата Сообщение от Rube Посмотреть сообщение
final MesageModel mesagemodel = objects.get(position);
Вот это надо в конструкторе, а не в getView.
У меня тоже так. Можно переделать (через функцию getItem), можно и так оставить.
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
28.05.2015, 07:24     Баг с items при прокручивании ListView #13
Хотя да, надо в getView, т.к. тут два итема в одном листвью.
CoolMind, а где я не вижу 2 итема разных в коде нету же?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
28.05.2015, 09:34     Баг с items при прокручивании ListView #14
Rube, да, я брал из своего проекта пример, не переделывал под ТС.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2015, 11:56     Баг с items при прокручивании ListView
Еще ссылки по теме:
Ошибка при выборе Item в ListView Android
Скрывать Toolbar при пролистывании ListView Android
Android ListView и мультивыбор при открытии активити
Listview вывод данных и переход по нажатию на другой Listview SQLite Android
Android Изменение данных в ListView при вводе текста

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

Или воспользуйтесь поиском по форуму:
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
28.05.2015, 11:56     Баг с items при прокручивании ListView #15
EgorDybovik, ты подумай сам.
У тебя два лэйаута и ты их тасуешь.
Адаптер без малейшего, что он там подсовывает листвью - с тем лэйаутом или нет - это твоя забота.

Т.е. тебе нужна еще одна проверка, к какому типу относится подсовываемый адаптером convertview и нужно/можно ли его использовать в данный момент или нужно инфлэйтить новый.

Для этого тебе нужен еще один флаг, который всунь в viewHolder и по которому потом делай проверку, что за чухню тебе подсунул адаптер

Java
1
2
3
4
static class ViewHolder{
        public TextView mesageTExt;
        public int viewLayoutType;
    }
Ферштейн?
Yandex
Объявления
28.05.2015, 11:56     Баг с items при прокручивании ListView
Ответ Создать тему
Опции темы

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