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

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

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

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

25.05.2015, 22:15. Просмотров 930. Ответов 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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
29.05.2015, 19:51     Баг с items при прокручивании ListView #21
Цитата Сообщение от Rube Посмотреть сообщение
Так можно чтоли?
Ну, там еще одно условие есть при else, так что оно так да не так
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 128
29.05.2015, 19:51  [ТС]     Баг с items при прокручивании ListView #22
Armagedo,
Ну я хоть и в java лох лохом но до этого додумался, я просто
LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
Вынес выше чем
f (convertView == null) {

Ради интереса сделал так же как у вас, тоже самое ...
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
29.05.2015, 19:55     Баг с items при прокручивании ListView #23
Что то же самое?
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 128
29.05.2015, 22:17  [ТС]     Баг с items при прокручивании ListView #24
Armagedo,
Выкидывает из приложения с ошибкой
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
30.05.2015, 00:24     Баг с items при прокручивании ListView #25
EgorDybovik, что у вас в 81 строке? Там проявляется ошибка NullPointer Exception, насколько понял. Попробуйте закомментировать часть кода.
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 128
30.05.2015, 18:34  [ТС]     Баг с items при прокручивании ListView #26
В этой строчке он ругается на
Java
1
2
holder.textMesage.setText(mesagemodel.getTextMesage());
holder.timeText.setText("time");
Но не могу понять почему
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
30.05.2015, 18:41     Баг с items при прокручивании ListView #27
Так при convertview не null у тебя ни textMesage, ни timeText не инициализируются.
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 128
30.05.2015, 18:50  [ТС]     Баг с items при прокручивании ListView #28
Цитата Сообщение от Armagedo Посмотреть сообщение
Так при convertview не null у тебя ни textMesage, ни timeText не инициализируются.
ничего не понял
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
30.05.2015, 18:51     Баг с items при прокручивании ListView #29
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        
        final MesageModel mesagemodel = objects.get(position);
        final ViewHolder holder;
        
        if (convertView == null) {
            holder = new ViewHolder();
            holder.viewType = mesagemodel.getVov();
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        
            if(holder.viewType.compareTo("1")==0){
                convertView = inflater.inflate(R.layout.my_mesage_list, parent, false);
            } else {
                convertView = inflater.inflate(R.layout.friend_mesage_list, parent, false);
            }
            
        
            holder.textMesage = (TextView) convertView.findViewById(R.id.textMesage);
            holder.timeText = (TextView) convertView.findViewById(R.id.viewTime);
            convertView.setTag(holder);
 
        } else {
            holder = (ViewHolder) convertView.getTag();
            if(holder.viewType.compareTo(mesagemodel.getVov())!=0){
              LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE); 
              if(holder.viewType.compareTo("1")==0)
                   convertView = inflater.inflate(R.layout.my_mesage_list, parent, false);
                       else 
                           convertView = inflater.inflate(R.layout.friend_mesage_list, parent, false);
 
              holder.textMesage = (TextView) convertView.findViewById(R.id.textMesage);
              holder.timeText = (TextView) convertView.findViewById(R.id.viewTime);
              convertView.setTag(holder);
            }
        }
        
        holder.textMesage.setText(mesagemodel.getTextMesage());
        holder.timeText.setText("time");
 
        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;
    }
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 128
30.05.2015, 18:58  [ТС]     Баг с items при прокручивании ListView #30
Вот весь мой код:
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
package adapters;
 
import java.util.List;
 
import com.example.wall_call.R;
 
import viewTemplate.mesageTemplate;
 
 
import model.MesageModel;
import android.app.Activity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import android.widget.Toast;
 
public class MesageAdapter extends ArrayAdapter<MesageModel> {
    private List<MesageModel> objects;
    private Activity context;
    public MesageAdapter(Activity context, List<MesageModel> objects) {
        super(context, R.layout.mesager_layout, objects);
        this.objects = objects;
        this.context = context;
    }
    
    @Override
    public int getCount() {
        return objects.size();
    }
    @Override
    public MesageModel getItem(int position) {
        return objects.get(position);
    }
    
    @Override
    public long getItemId(int position) {
        return position;
    }
    
    @Override
    public int getViewTypeCount() {
        return 2;
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final MesageModel mesagemodel = objects.get(position);
        final ViewHolder holder;
        View v = convertView;
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        if (v == null) {
            holder = new ViewHolder();
            holder.viewType = mesagemodel.getVov();
            
            //Log.d("myLog",mesageTempl.viewType);
            
            if(holder.viewType.compareTo("1")==0){
                v = inflater.inflate(R.layout.my_mesage_list, parent, false);
            } else {
                v = inflater.inflate(R.layout.friend_mesage_list, parent, false);
            }
            
        
            
            holder.textMesage = (TextView) v.findViewById(R.id.textMesage);
            holder.timeText = (TextView) v.findViewById(R.id.viewTime);
            
            v.setTag(holder);
 
        } else {
            
            
            holder = (ViewHolder) v.getTag();
            if(holder.viewType.compareTo(mesagemodel.getVov())!=0){
                if(holder.viewType.compareTo("1")==0){
                    v = inflater.inflate(R.layout.my_mesage_list, parent, false);
                } else {
                    v = inflater.inflate(R.layout.friend_mesage_list, parent, false);
                }
                holder.textMesage = (TextView) v.findViewById(R.id.textMesage);
                holder.timeText = (TextView) v.findViewById(R.id.viewTime);
                convertView.setTag(holder);
            }
        }
        
        
        holder.textMesage.setText(mesagemodel.getTextMesage());
        holder.timeText.setText("time");
 
        /*v.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 v;
    }
    
     static class ViewHolder{
         TextView textMesage;
         TextView timeText;
         String viewType;
    }
 
}
Ругается теперь на строку 78
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
30.05.2015, 19:00     Баг с items при прокручивании ListView #31
Цитата Сообщение от EgorDybovik Посмотреть сообщение
Ругается теперь на строку 78
как именно?

И чё осталось
Java
1
convertView.setTag(holder);
а не

Java
1
v.setTag(holder);
?
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 128
30.05.2015, 19:01  [ТС]     Баг с items при прокручивании ListView #32
Цитата Сообщение от Armagedo Посмотреть сообщение
И чё осталось
Код Java(TM) 2 Platform Standard Edition 5.0
1
convertView.setTag(holder);
Тут да, мой косяк ...
Вот как ругается
Java
1
2
3
4
05-30 14:56:45.005: E/AndroidRuntime(1996): FATAL EXCEPTION: main
05-30 14:56:45.005: E/AndroidRuntime(1996): java.lang.NullPointerException
05-30 14:56:45.005: E/AndroidRuntime(1996):     at adapters.MesageAdapter.getView(MesageAdapter.java:78)
05-30 14:56:45.005: E/AndroidRuntime(1996):     at android.widget.AbsListView.obtainView(AbsListView.java:2143)
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
30.05.2015, 19:03     Баг с items при прокручивании ListView #33
Цитата Сообщение от EgorDybovik Посмотреть сообщение
Вот как ругается
так а что в 78-й строке-то?
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 128
30.05.2015, 19:07  [ТС]     Баг с items при прокручивании ListView #34
Так, я поматвил вместо convertView - v ,вроде ошибку не выкидывает, но с текстом в items происходит какая то херня ))) такая что я даже обьяснить не знаю как , текст прыгает, меняется хер пойми на что ))

Добавлено через 1 минуту
Вообще полный бред какой то творится со списоком ...
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
30.05.2015, 19:09     Баг с items при прокручивании ListView #35

води пальцем по коду и смотри чё куда, по-другому никак

Цитата Сообщение от EgorDybovik Посмотреть сообщение
какая то херня ))) такая что я даже обьяснить не знаю как , текст прыгает, меняется хер пойми на что ))
всё давно объяснено
https://www.youtube.com/watch?v=giC3-LnnV4c

EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 128
30.05.2015, 19:14  [ТС]     Баг с items при прокручивании ListView #36
Цитата Сообщение от Armagedo Посмотреть сообщение
води пальцем по коду и смотри чё куда, по-другому никак
Если бы я еще одекватно понимал как тут код работает волностью,

Цитата Сообщение от Armagedo Посмотреть сообщение
https://www.youtube.com/watch?v=giC3-LnnV4c
Это точно!
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
30.05.2015, 19:33     Баг с items при прокручивании ListView #37
У меня вообще такое чувство, что в твоём случае использование convertView и viewHolder всё только усложняет и никто не знает даёт ли оно какой-то эффект по производительности. Я думаю, что этот эффект близок к нулю. Они работают на "однородных" лэйаутах.

Т.е. забудь про них и просто каждый раз инфлейти новый нужный тебе в данный момент вью и находи вью-элементы каждый раз через v.findViewById.
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 128
30.05.2015, 21:32  [ТС]     Баг с items при прокручивании ListView #38
У меня все получилось... О боги, наконецтоки ... Конечно с помощью Armagedo, за что вам отдельное спасибо, и всем остальным конечно ))
Вот рабочий код который, может кому поможет
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
public View getView(int position, View convertView, ViewGroup parent) {
        final MesageModel mesagemodel = objects.get(position);
        final ViewHolder holder;
        View v = convertView;
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
        if (v == null) {
            holder = new ViewHolder();
            holder.viewType = mesagemodel.getVov();
            
            //Log.d("myLog",mesageTempl.viewType);
            
            if(holder.viewType.compareTo("1")==0){
                v = inflater.inflate(R.layout.my_mesage_list, parent, false);
            } else {
                v = inflater.inflate(R.layout.friend_mesage_list, parent, false);
            }
            
        
            
            holder.textMesage = (TextView) v.findViewById(R.id.textMesage);
            holder.timeText = (TextView) v.findViewById(R.id.viewTime);
            
            v.setTag(holder);
 
        } else {
            holder = (ViewHolder) v.getTag();
            holder.viewType = mesagemodel.getVov();
            if(holder.viewType.compareTo("1")==0){
                v = inflater.inflate(R.layout.my_mesage_list, parent, false);
            } else {
                v = inflater.inflate(R.layout.friend_mesage_list, parent, false);
            }
            holder.textMesage = (TextView) v.findViewById(R.id.textMesage);
            holder.timeText = (TextView) v.findViewById(R.id.viewTime);
            v.setTag(holder);
        }
        
        
        holder.textMesage.setText(mesagemodel.getTextMesage());
        holder.timeText.setText("time");
 
        /*v.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 v;
    }
    
     static class ViewHolder{
         TextView textMesage;
         TextView timeText;
         String viewType;
    }
Добавлено через 4 минуты
Нужно было только в блоке else добавить holder.viewType = mesagemodel.getVov();

Ну и такой скромный вопросик )) понятное дело что это у меня мини чат, как сделать что бы listView появился с конца списка, ну типа пролестался в низ, только без анимации а сразу?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2015, 21:45     Баг с items при прокручивании ListView
Еще ссылки по теме:
Ошибка при выборе Item в ListView Android
Скрывать Toolbar при пролистывании ListView Android
Android ListView и мультивыбор при открытии активити
Listview вывод данных и переход по нажатию на другой Listview SQLite Android
Android Изменение данных в ListView при вводе текста

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

Или воспользуйтесь поиском по форуму:
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
30.05.2015, 21:45     Баг с items при прокручивании ListView #39
Цитата Сообщение от EgorDybovik Посмотреть сообщение
Вот рабочий код который, может кому поможет
та отдай ты этот holder к собакам бешанным - он тебе не нужен

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
public View getView(int position, View convertView, ViewGroup parent) {
        final MesageModel mesagemodel = objects.get(position);
 
        View v;
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
            
            if(mesagemodel.getVov().compareTo("1")==0){
                v = inflater.inflate(R.layout.my_mesage_list, parent, false);
            } else {
                v = inflater.inflate(R.layout.friend_mesage_list, parent, false);
            }
 
           TextView textMesage = (TextView) v.findViewById(R.id.textMesage);
           TextView timeText = (TextView) v.findViewById(R.id.viewTime);
            
            textMesage.setText(mesagemodel.getTextMesage());
            timeText.setText("time");
 
        /*v.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 v;
    }
Цитата Сообщение от EgorDybovik Посмотреть сообщение
Ну и такой скромный вопросик )) понятное дело что это у меня мини чат, как сделать что бы listView появился с конца списка, ну типа пролестался в низ, только без анимации а сразу?
XML
1
2
3
4
<ListView 
    android:stackFromBottom="true"
...
></ListView>
Yandex
Объявления
30.05.2015, 21:45     Баг с items при прокручивании ListView
Ответ Создать тему
Опции темы

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