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

Баг с items при прокручивании ListView

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

Суть такая, что выводится список ListView. Там items могут быть двух разных видов(ну тоесть два немного разных Layout) в зависимости от данных которые выводятся. Когда все выводится то все хорошо, но если прокрутить в низ список так что бы пару пунктов списка спрятались то потом если прокрутить обратно то эти элементы могут поменять совй layout, на примем если в начале, в 1 элементе текст был с лева, а во втором с права, то потом они могут поменятся 1-текст с права, 2 - текст с лева (сам текст не меняется) .. Что это такое и как с этим боротся ?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2015, 22:15
Ответы с готовыми решениями:

ListView ошибка при прокручивании
Читаю с json файла данные и добавляю их в ListView, первые 5 отображаются, а...

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

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

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

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

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

Ради интереса сделал так же как у вас, тоже самое ...
0
Armagedo
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
29.05.2015, 19:55 23
Что то же самое?
1
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 129
29.05.2015, 22:17  [ТС] 24
Armagedo,
Выкидывает из приложения с ошибкой
0
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,734
30.05.2015, 00:24 25
EgorDybovik, что у вас в 81 строке? Там проявляется ошибка NullPointer Exception, насколько понял. Попробуйте закомментировать часть кода.
1
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 129
30.05.2015, 18:34  [ТС] 26
В этой строчке он ругается на
Java
1
2
holder.textMesage.setText(mesagemodel.getTextMesage());
holder.timeText.setText("time");
Но не могу понять почему
0
Armagedo
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
30.05.2015, 18:41 27
Так при convertview не null у тебя ни textMesage, ни timeText не инициализируются.
1
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 129
30.05.2015, 18:50  [ТС] 28
Цитата Сообщение от Armagedo Посмотреть сообщение
Так при convertview не null у тебя ни textMesage, ни timeText не инициализируются.
ничего не понял
0
Armagedo
210 / 210 / 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 / 0
Регистрация: 24.02.2013
Сообщений: 129
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
210 / 210 / 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 / 0
Регистрация: 24.02.2013
Сообщений: 129
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
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
30.05.2015, 19:03 33
Цитата Сообщение от EgorDybovik Посмотреть сообщение
Вот как ругается
так а что в 78-й строке-то?
1
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 129
30.05.2015, 19:07  [ТС] 34
Так, я поматвил вместо convertView - v ,вроде ошибку не выкидывает, но с текстом в items происходит какая то херня ))) такая что я даже обьяснить не знаю как , текст прыгает, меняется хер пойми на что ))

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

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

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

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

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

Т.е. забудь про них и просто каждый раз инфлейти новый нужный тебе в данный момент вью и находи вью-элементы каждый раз через v.findViewById.
1
EgorDybovik
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 129
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
210 / 210 / 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

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

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

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


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

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

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