2015-09-22 3 views
0

Я знаю, что этот вопрос задан раньше и получил понимание примерно того, что происходит, но я не могу найти решение.Элементы ImageButton с возможностью изменения при щелчке в ListView, по-видимому, меняется на 2 элемента одновременно

В моем адаптере пользовательского списка и внутри public View getView(int position, View convertView, ViewGroup parent) { ive настройка функции щелчка для элементов 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); 

} 

}); 

The Imagebutton - это чистая звезда, а при нажатии на нее меняется то же, что и на желтую звезду. Он работает нормально.

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

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

Благодаря

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

//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"); 

    } 
+0

Просьба показать весь метод 'getView'. – Buddy

+0

@Buddy - не проблема, его довольно долго, потому что я проверяю базу данных, если ее закладки – Tasos

+1

Возможно, это потому, что вы перерабатываете взгляды и не заново раздуваете их правильно. –

ответ

1

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

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

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

+0

ok Я понимаю, как и где я могу восстановить ресурс изображения закладки? – Tasos

+0

Попробуйте сбросить их после вызова 'bookmark.setTag' – Buddy

+0

ok держитесь за неудачную попытку, чтобы – Tasos

1

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

+0

Знаете ли вы, как я это делаю? – Tasos

+0

Вы должны установить то же самое, что и при установке желтой звезды ('bookmark.setImageResource (R.drawable.ic_bookmarked);'). Но с другим ресурсом, конечно. –

+0

спасибо, я понимаю, что происходит сейчас, я просто не могу понять, где мне нужно установить оригинальную закладку i con. – Tasos