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

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

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

Одинаковый хэш-код элементов ListView - Программирование Android

16.02.2015, 01:32. Просмотров 401. Ответов 9
Метки нет (Все метки)

У меня есть ListView с кастомным элементом. В этом кастомном элементе есть кнопка для которой я прописал селектор и состояния. Для адаптера использовал BaseAdapter. Для примера установил 9 элементов списка. Вот содержимое метода getView:
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
    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        View view = convertView;
        ViewHolderItem viewHolderItem;
        if (view == null){
            view = mInflater.inflate(R.layout.item_news, parent, false);
 
            viewHolderItem = new ViewHolderItem();
 
            viewHolderItem.infoText = (TextView) view.findViewById(R.id.info_text_textView);
            viewHolderItem.likeButton = (FButton) view.findViewById(R.id.like_post_button);
            viewHolderItem.card = (CardView) view.findViewById(R.id.news_item_cardView);
 
            view.setTag(viewHolderItem);
 
        } else {
            viewHolderItem = (ViewHolderItem) view.getTag();
        }
 
        viewHolderItem.infoText.setText(items[position]);
        viewHolderItem.likeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setSelected(!v.isSelected());
            }
        });
 
        viewHolderItem.card.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("MYTAG", "Position: " + position + " Hash: " + Long.toString(v.hashCode()));
            }
        });
 
        return view;
    }
 
    static class ViewHolderItem {
        TextView infoText;
        FButton likeButton;
        CardView card;
    }
Когда я нажимаю на кнопку в первом элемента, то я фиксирую её как нажатая:
Java
1
v.setSelected(!v.isSelected());
Но пролистав вниз, когда все первые элементы ушли с экрана и заменились другими у меня каким-то чудом стала выделенная кнопка и в 6 элементе. Не много расследовав эту магию, мне удалось выяснить что хэш-код первого элемента и 6-го совпадают, соответственно хэш-код 2-го с 7-м совпадают и т.д. Как можно это исправить, чтобы при прокрутке состояние элемента оставалось неизменным и не повторялось на других?
Если заметить, то я использую паттерн ViewHolder.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2015, 01:32     Одинаковый хэш-код элементов ListView
Посмотрите здесь:

Просмотр элементов в ListView - Программирование Android
нужно что бы при нажатии на элемент открывалось отдельное окно с более детальной информацией данного элемента

Добавление элементов в listview из БД - Программирование Android
Здравствуйте. У меня не выходит выбросить из списка одинаковые элементы. Я из БД вытаскиваю номера групп, которые соответственно...

Прорисовка элементов в ListView - Программирование Android
Доброго дня. Необходимо сделать свой список с своим View, нашёл статью и сделал как в ней. Но поведение CheckBox'ов оказалось поломанное....

ListView с изменяющимся количеством элементов - Программирование Android
Нужно реализовать виджет ListView с изменяющимся количеством элементов. Пытался реализовать свой адаптер-наследник от ArrayAdapter и в...

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

Вывод элементов ListView в строчку - Программирование Android
Есть вывод данных с базы в ListView : class LoadAllProducts extends AsyncTask<String, String, String> { /** *...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
16.02.2015, 18:30     Одинаковый хэш-код элементов ListView #2
Попробуйте в качестве идентификатора использовать Хэш-код + позиция.
neic777
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 138
16.02.2015, 19:03  [ТС]     Одинаковый хэш-код элементов ListView #3
Nixy, не вариант.
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
16.02.2015, 19:35     Одинаковый хэш-код элементов ListView #4
Как вариант "зажатость" кнопки можно отслеживать как данные, и брать опять таки по позиции View, как вы берете значение текста.
neic777
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 138
16.02.2015, 19:37  [ТС]     Одинаковый хэш-код элементов ListView #5
Пробовал через данные, таким способом и не помогло:
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
public class NewsAdapter extends BaseAdapter{ 
    private String[] items = new String[]{"TEST TEXT 1","TEST TEXT 2","TEST TEXT 3","TEST TEXT 4", 
            "TEST TEXT 5", "TEST TEXT 6", "TEST TEXT 7","TEST TEXT 8","TEST TEXT 9"}; 
 
    private Context mContext; 
    private LayoutInflater mInflater; 
    private Map<Integer, Boolean> mItemStatus; 
 
    public NewsAdapter(Context _context){ 
        mContext = _context; 
        mInflater = (LayoutInflater) _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
 
        mItemStatus = new HashMap<>(); 
        for (int i = 0; i < 9; i++){ 
            mItemStatus.put(i, false); 
        } 
    } 
 
    @Override 
    public int getCount() { 
        return items.length; 
    } 
 
    @Override 
    public Object getItem(int position) { 
        return null; 
    } 
 
    @Override 
    public long getItemId(int position) { 
        return position; 
    } 
 
    @Override 
    public View getView(final int position, View convertView, final ViewGroup parent) { 
        View view = convertView; 
        ViewHolderItem viewHolderItem; 
        if (view == null){ 
            view = mInflater.inflate(R.layout.item_news, parent, false); 
 
            viewHolderItem = new ViewHolderItem(); 
 
            viewHolderItem.infoText = (TextView) view.findViewById(R.id.info_text_textView); 
            viewHolderItem.likeButton = (FButton) view.findViewById(R.id.like_post_button); 
            viewHolderItem.card = (CardView) view.findViewById(R.id.news_item_cardView); 
            if (mItemStatus.get(position)){ 
                viewHolderItem.likeButton.setSelected(true); 
            } 
 
            view.setTag(viewHolderItem); 
 
        } else { 
            viewHolderItem = (ViewHolderItem) view.getTag(); 
        } 
 
        viewHolderItem.infoText.setText(items[position]); 
        viewHolderItem.likeButton.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                if (mItemStatus.get(position)) { 
                    v.setSelected(false); 
                    mItemStatus.put(position, false); 
                } else { 
                    v.setSelected(true); 
                    mItemStatus.put(position, true); 
                } 
            } 
        }); 
 
        viewHolderItem.card.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                Toast.makeText(mContext, "Position: " + position + " Hash: " + Long.toString(v.hashCode()), Toast.LENGTH_SHORT).show(); 
                Log.d("MYTAG", "Position: " + position + " Hash: " + Long.toString(v.hashCode())); 
            } 
        }); 
 
        return view; 
    } 
 
    static class ViewHolderItem { 
        TextView infoText; 
        FButton likeButton; 
        CardView card; 
    } 
}
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
16.02.2015, 19:56     Одинаковый хэш-код элементов ListView #6
Цитата Сообщение от neic777 Посмотреть сообщение
Не много расследовав эту магию, мне удалось выяснить что хэш-код первого элемента и 6-го совпадают, соответственно хэш-код 2-го с 7-м совпадают и т.д.
Было бы более странно, если бы этого не происходило.
Это бы означало, что мехнизм recycler листвью не фурычит и господина Гая можно четвертовать.

Правда, это не значит, что цифра 5 какая-то магическая.
Наполните большим количеством элементов и погоняйте листвью вверх-вниз, и вы увидите, что творится вообще беспредел - как и должно быть.


Как можно это исправить, чтобы при прокрутке состояние элемента оставалось неизменным и не повторялось на других?
Слушайте Nixy, запоминайте нажатую позицию и отслеживайте по этой позиции в адаптере, соответственно меняя или нет "выбранность".
neic777
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 138
16.02.2015, 20:20  [ТС]     Одинаковый хэш-код элементов ListView #7
Armagedo, я уже понял фичу с этой магией. Но, я запоминаю в посте выше с помощью Мапа, но результат тот же.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
16.02.2015, 20:33     Одинаковый хэш-код элементов ListView #8
Добавлено через 8 минут
Цитата Сообщение от neic777 Посмотреть сообщение
я запоминаю в посте выше с помощью Мапа, но результат тот же.
А так?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
if (view == null){ 
            view = mInflater.inflate(R.layout.item_news, parent, false); 
 
            viewHolderItem = new ViewHolderItem(); 
 
            viewHolderItem.infoText = (TextView) view.findViewById(R.id.info_text_textView); 
            viewHolderItem.likeButton = (FButton) view.findViewById(R.id.like_post_button); 
            viewHolderItem.card = (CardView) view.findViewById(R.id.news_item_cardView); 
            
            view.setTag(viewHolderItem); 
 
        } else { 
            viewHolderItem = (ViewHolderItem) view.getTag(); 
        } 
 
         viewHolderItem.likeButton.setSelected(mItemStatus.get(position)); 
         
        viewHolderItem.infoText.setText(items[position]); 
...
neic777
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 138
16.02.2015, 21:04  [ТС]     Одинаковый хэш-код элементов ListView #9
Armagedo, помогло. Да уж, я жестко протупил с тем где надо было вставлять результат сохранения данных. Спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2015, 21:06     Одинаковый хэш-код элементов ListView
Еще ссылки по теме:

Добавление нескольких элементов в ListView - Программирование Android
Не могу разобрался с ListView.Есть несколько адаптеров как их добавить в ListView?

Получение нажатых элементов listview - Программирование Android
Добрый день! Есть listview с кастомным адаптером. В каждом элементе этого listview есть checkbox. Проблема в том что с кастомным...

Как зафиксировать ширину элементов ListView - Программирование Android
Подскажите как отредактировать разметку элемента ListView. На данный момент есть следующее - checkBox, TextView и ImageView. &lt;?xml...

Доступ к содержимому элементов кастомного ListView - Программирование Android
Есть у меня ListView Есть кастомный ListAdapter, который делает элементы аля &quot;TextView - EditText&quot; В общем, тут всё круто, всё...


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

Или воспользуйтесь поиском по форуму:
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
16.02.2015, 21:06     Одинаковый хэш-код элементов ListView #10
Цитата Сообщение от neic777 Посмотреть сообщение
Да уж, я жестко протупил
да ладно - просто поспешил

Удачи
Yandex
Объявления
16.02.2015, 21:06     Одинаковый хэш-код элементов ListView
Ответ Создать тему
Опции темы

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