Элементы ImageButton, которые можно изменить при нажатии в ListView, похоже, меняются для 2 элементов за раз

Я знаю, что этот вопрос задавали раньше, и я примерно понял, что происходит, но я не могу найти решение.

В моем адаптере пользовательского списка и внутри public View getView(int position, View convertView, ViewGroup parent) { я настроил функцию щелчка для элементов ImageButton.

final ImageButton bookmark = (ImageButton)
convertView.findViewById(R.id.bookmarkthis);
        bookmark.setTag(position);
        bookmark.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                bookmark.setImageResource(R.drawable.ic_bookmarked);
                bookmark.setTag(R.drawable.ic_bookmarked);

}

});

Кнопка Image представляет собой прозрачную звезду, и при нажатии она меняет тот же рисунок на желтую звезду. Работает нормально.

Проблема заключается в том, что когда я нажимаю значок «Элемент в позиции 0», чтобы сделать его желтым, он также меняется для элемента 8, расположенного дальше по списку, которого еще нет в представлении. если я нажму на позицию 1, она также изменится на позицию 9 и так далее.

Я осмотрелся, изучил проблему и даже попробовал держатель для кнопки изображения, но безуспешно. Что-то мешает доступному изменению для ImageButton только его правильной позиции.

Спасибо

Решение состоит в том, чтобы изначально установить элемент флага в массиве для каждого элемента. Затем onClick установите флаг true только для этого элемента. Затем в getView это просто случай оператора if для проверки флага, когда элементы зацикливаются.

//in array creation
items.setFlag("false");

//in getView as you set Text and what ever get the Flag state
String flag = m.getFlag();

 //check the flag state and take action in this case change the icon accordingly
 if (Objects.equals(flag, "true")) {
            bookmark.setImageResource(R.drawable.ic_bookmarked);
            bookmark.setTag(R.drawable.ic_bookmarked);
        }

        else {
            bookmark.setImageResource(R.drawable.ic_bookmark);
        }


// and in the click function
           @Override
                public void onClick(View v) {

                    bookmark.setImageResource(R.drawable.ic_bookmarked);
                    m.setFlag("true");

    }

person Tasos    schedule 22.09.2015    source источник
comment
Покажите весь метод getView.   -  person Buddy    schedule 22.09.2015
comment
@Buddy - нет проблем, это довольно долго, потому что я проверяю базу данных, если она добавлена ​​в закладки   -  person Tasos    schedule 22.09.2015
comment
Вероятно, это потому, что вы перерабатываете просмотры, а не повторно накачиваете их правильно.   -  person Neil M.    schedule 22.09.2015


Ответы (2)


Вам необходимо сбросить bookmark значение ресурса изображения и значения тега, если ненулевое convertView передается в getView. Ваш обработчик onClick устанавливает для них следующие значения:

bookmark.setImageResource(R.drawable.ic_bookmarked);
bookmark.setTag(R.drawable.ic_bookmarked);

Поэтому вам нужно сбросить их значения по умолчанию при отображении нового элемента списка.

person Buddy    schedule 22.09.2015
comment
хорошо, я вроде понял - как и где сбросить ресурс изображения закладки? - person Tasos; 22.09.2015
comment
Попробуйте сбросить их после вызова bookmark.setTag - person Buddy; 22.09.2015
comment
я пытался в различных областях кода установить оригинальный значок звезды. Лучше всего было установить его после -- bookmark.setTag(position); bookmark.setImageResource(R.drawable.ic_bookmark); - кажется, что это перестает дублировать изменение значка при нажатии, но если я прокручиваю вниз и снова вверх, значок желтой звезды возвращается к обычному значку звезды. Любые идеи, пожалуйста? - person Tasos; 23.09.2015
comment
Да, то, что вы действительно должны сделать, это внутри getView проверить, добавлен ли элемент в закладки, а затем установить изображение/тег соответствующим образом... - person Buddy; 23.09.2015
comment
точно мои мысли, я попытался поместить туда оператор if, быстрый вопрос, остается ли тег (setImageResource (R.drawable.ic_bookmarked)) даже после того, как я установил -- bookmark.setTag (position); bookmark.setImageResource(R.drawable.ic_bookmark); -- потому что id не сработал -- попробую еще раз, может я что-то пропустил - person Tasos; 23.09.2015
comment
Если вы установите новый тег, он перезапишет предыдущий. - person Buddy; 23.09.2015
comment
Давайте продолжим это обсуждение в чате. - person Buddy; 23.09.2015
comment
Все сделано дружище. Да, спасибо за идею с флагом. Я установил для дополнительного флага элемента в массиве значение false и использовал (m), чтобы установить флаг в значение true при нажатии на звездочку. и, наконец, оператор if в getView для проверки флага и соответствующей установки значка. Я РАД, ЧТО ЭТО ЗАКОНЧИЛОСЬ. :))) - person Tasos; 23.09.2015

ListView повторно использует представления, которые выходят за пределы допустимого диапазона. Вы не сбрасываете значок «закладка» при повторном использовании представлений (когда вы получаете ненулевой convertView). Не забывайте всегда сбрасывать все свойства ваших представлений на правильные значения, и у вас не возникнет проблем.

person Snild Dolkow    schedule 22.09.2015
comment
ты знаешь как я это делаю? - person Tasos; 22.09.2015
comment
Вы должны установить так же, как при установке желтой звезды (bookmark.setImageResource(R.drawable.ic_bookmarked);). Но с другим ресурсом, разумеется. - person Snild Dolkow; 22.09.2015
comment
спасибо, теперь я понимаю, что происходит, я просто не могу понять, где мне нужно установить исходную закладку i con. - person Tasos; 23.09.2015