Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 138

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

16.02.2015, 01:32. Показов 909. Ответов 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.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.02.2015, 01:32
Ответы с готовыми решениями:

Одинаковый код для одного события у разных элементов управления
У каждого элемента управления есть события. Например MouseMove. Мне необходимо на каждый элемент управления прописать одинаковую строку...

Одинаковый код в разных компиляторах
Ребят привет, вот как так происходит, что в разных компиляторах выдаёт разный результат один и тот же код, да плюс вообще логика не...

Одинаковый код но выдает ошибку
Доброго времени суток, добрался до рекламы, учусь встраивать Unity Ads, но столкнулся с проблемой, а в частности что у человека из видео...

9
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
16.02.2015, 18:30
Попробуйте в качестве идентификатора использовать Хэш-код + позиция.
0
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 138
16.02.2015, 19:03  [ТС]
Nixy, не вариант.
0
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
16.02.2015, 19:35
Как вариант "зажатость" кнопки можно отслеживать как данные, и брать опять таки по позиции View, как вы берете значение текста.
0
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 138
16.02.2015, 19:37  [ТС]
Пробовал через данные, таким способом и не помогло:
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; 
    } 
}
0
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
16.02.2015, 19:56
Цитата Сообщение от neic777 Посмотреть сообщение
Не много расследовав эту магию, мне удалось выяснить что хэш-код первого элемента и 6-го совпадают, соответственно хэш-код 2-го с 7-м совпадают и т.д.
Было бы более странно, если бы этого не происходило.
Это бы означало, что мехнизм recycler листвью не фурычит и господина Гая можно четвертовать.

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


Как можно это исправить, чтобы при прокрутке состояние элемента оставалось неизменным и не повторялось на других?
Слушайте Nixy, запоминайте нажатую позицию и отслеживайте по этой позиции в адаптере, соответственно меняя или нет "выбранность".
1
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 138
16.02.2015, 20:20  [ТС]
Armagedo, я уже понял фичу с этой магией. Но, я запоминаю в посте выше с помощью Мапа, но результат тот же.
0
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
16.02.2015, 20:33
Добавлено через 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]); 
...
1
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 138
16.02.2015, 21:04  [ТС]
Armagedo, помогло. Да уж, я жестко протупил с тем где надо было вставлять результат сохранения данных. Спасибо.
0
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
16.02.2015, 21:06
Цитата Сообщение от neic777 Посмотреть сообщение
Да уж, я жестко протупил
да ладно - просто поспешил

Удачи
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.02.2015, 21:06
Помогаю со студенческими работами здесь

Одинаковый код для нескольких картинок
На форме расположены штук 20 картинок. Каждой из них необходимо присвоить одинаковую реакцию на несколько действий (MouseClick/Move/Up...) ...

Код абсолютно одинаковый как в примере, но не работает
пример контактной формы (плавающий placeholder) https://bootsnipp.com/snippets/qlDqg HTML, CSS, jQuery одинаковые как в...

Хэш код
Добрый вечер, попался дипломный проект на тему составления программы для расчет хэш кода, c# я в принципе знаю очень поверхностно, но...

Хэш код
В базе данных есть таблица с полями: USER и User_Password. Она служит для авторизации пользователей при запуске программы. Как сделать так...

Одинаковый код для разных форм и контролов. MVVM
Есть у меня одна модель и 2 формы. В формах содержится 4 usercontrol в которых понакидано несколько обычных контролов (комбобоксы там...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru