Елементите 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);

}

});

Бутонът за изображение е ясна звезда и когато се щракне върху него, той се променя на жълта звезда. Работи добре.

Проблемът е, че когато щракна върху Елемент в позиция 0 икона със звезда, за да стане жълто, това също се променя за елемент 8 по-надолу в списъка, който все още не е в Изглед. ако щракна позиция 1 се променя и за позиция 9 и т.н.

Огледах наоколо и проучих проблема и дори опитах държач за Imagebutton, но не се получи. Нещо пречи на промяната с възможност за рисуване за 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); -- защото идентификаторът не работи -- ще опитам отново, може би съм пропуснал нещо - 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