Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
 
EgorDybovik
0 / 0 / 2
Регистрация: 24.02.2013
Сообщений: 128
#1

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

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

Суть такая, что выводится список ListView. Там items могут быть двух разных видов(ну тоесть два немного разных Layout) в зависимости от данных которые выводятся. Когда все выводится то все хорошо, но если прокрутить в низ список так что бы пару пунктов списка спрятались то потом если прокрутить обратно то эти элементы могут поменять совй layout, на примем если в начале, в 1 элементе текст был с лева, а во втором с права, то потом они могут поменятся 1-текст с права, 2 - текст с лева (сам текст не меняется) .. Что это такое и как с этим боротся ?
http://www.cyberforum.ru/android-dev/thread1215854.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2015, 22:15
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Баг с items при прокручивании ListView (Программирование Android):

Непонятный баг в ListView
В общем, суть такова: Имеется список контактов в ListView. Каждый пункт...

После вызова notifydataset() items в listview "моргают"
столкнулся с такой проблемой, перерыл stackoverflow, ответа не нашел есть...

ListView: сбивается содержимое ImageView элемента при скроллинге + как сделать выделение пункта списка при нажатии?
1. Есть свой класс ContactsSimpleCursorAdapter, в методе public void...

Как изменить цвет пункта ListView при нажатии на него и сохранять его цвет при проматывании списка?
Здравствуйте, подскажите, пожалуйста, как изменить цвет пункта ListView при...

Цвет ListView при скролинге
Добрый день. Есть ListView с белым фоном, на время скролинга фон становиться...

38
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
29.05.2015, 19:51 #21
Цитата Сообщение от Rube Посмотреть сообщение
Так можно чтоли?
Ну, там еще одно условие есть при else, так что оно так да не так
1
EgorDybovik
0 / 0 / 2
Регистрация: 24.02.2013
Сообщений: 128
29.05.2015, 19:51  [ТС] #22
Armagedo,
Ну я хоть и в java лох лохом но до этого додумался, я просто
LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
Вынес выше чем
f (convertView == null) {

Ради интереса сделал так же как у вас, тоже самое ...
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
29.05.2015, 19:55 #23
Что то же самое?
1
EgorDybovik
0 / 0 / 2
Регистрация: 24.02.2013
Сообщений: 128
29.05.2015, 22:17  [ТС] #24
Armagedo,
Выкидывает из приложения с ошибкой
0
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,732
30.05.2015, 00:24 #25
EgorDybovik, что у вас в 81 строке? Там проявляется ошибка NullPointer Exception, насколько понял. Попробуйте закомментировать часть кода.
1
EgorDybovik
0 / 0 / 2
Регистрация: 24.02.2013
Сообщений: 128
30.05.2015, 18:34  [ТС] #26
В этой строчке он ругается на
Java
1
2
holder.textMesage.setText(mesagemodel.getTextMesage());
holder.timeText.setText("time");
Но не могу понять почему
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
30.05.2015, 18:41 #27
Так при convertview не null у тебя ни textMesage, ни timeText не инициализируются.
1
EgorDybovik
0 / 0 / 2
Регистрация: 24.02.2013
Сообщений: 128
30.05.2015, 18:50  [ТС] #28
Цитата Сообщение от Armagedo Посмотреть сообщение
Так при convertview не null у тебя ни textMesage, ни timeText не инициализируются.
ничего не понял
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
30.05.2015, 18:51 #29
Лучший ответ Сообщение было отмечено EgorDybovik как решение

Решение

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;
    }
1
EgorDybovik
0 / 0 / 2
Регистрация: 24.02.2013
Сообщений: 128
30.05.2015, 18:58  [ТС] #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
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
30.05.2015, 19:00 #31
Цитата Сообщение от EgorDybovik Посмотреть сообщение
Ругается теперь на строку 78
как именно?

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

Java
1
v.setTag(holder);
?
1
EgorDybovik
0 / 0 / 2
Регистрация: 24.02.2013
Сообщений: 128
30.05.2015, 19:01  [ТС] #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)
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
30.05.2015, 19:03 #33
Цитата Сообщение от EgorDybovik Посмотреть сообщение
Вот как ругается
так а что в 78-й строке-то?
1
EgorDybovik
0 / 0 / 2
Регистрация: 24.02.2013
Сообщений: 128
30.05.2015, 19:07  [ТС] #34
Так, я поматвил вместо convertView - v ,вроде ошибку не выкидывает, но с текстом в items происходит какая то херня ))) такая что я даже обьяснить не знаю как , текст прыгает, меняется хер пойми на что ))

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

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

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

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

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

Т.е. забудь про них и просто каждый раз инфлейти новый нужный тебе в данный момент вью и находи вью-элементы каждый раз через v.findViewById.
1
EgorDybovik
0 / 0 / 2
Регистрация: 24.02.2013
Сообщений: 128
30.05.2015, 21:32  [ТС] #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 появился с конца списка, ну типа пролестался в низ, только без анимации а сразу?
0
Armagedo
209 / 209 / 60
Регистрация: 22.08.2014
Сообщений: 644
30.05.2015, 21:45 #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>
0
30.05.2015, 21:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2015, 21:45
Привет! Вот еще темы с решениями:

NullPointerException при поиске ListView
Здравствуйте! Есть список (ListView), заполненный данными, есть строка поиска...

Ошибка при выборе Item в ListView
Здравствуйте уважаемые форумчане. Не могу определить где ошибся. У меня есть...

ListView и мультивыбор при открытии активити
Здравствуйте. Подскажите пожалуйста, можно ли при открытии активити со...

Скрывать Toolbar при пролистывании ListView
Подскажите как реализовать, когда листаешь ListView, что бы Toolbar исчезал?...


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Опции темы

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