Задать вопрос
@StynuBlizz

Почему recyclerview использует один viewHolder несколько раз? И как исходя из этого правильно обработать нажатие?

Есть список,в нем 30 элементов и по нажатию на кнопку в первом элементе, эта кнопка должна изменить свой бэкграунд,но проблема в том что вместе с бэкграундом этой кнопки меняется еще и бэк кнопки в 15 элементе. И так для каждого элемента т.е нажму на кнопку во 2 элементе изменится в 16, и т.д.
private class SubscriptionHolder extends RecyclerView.ViewHolder {
       private Button buttonAddToFriendSUBSCRIPTIONS_FR;

        SubscriptionHolder (View itemView,int viewType) {
            super(itemView);
            buttonAddToFriendSUBSCRIPTIONS_FR = (Button) itemView.findViewById(R.id.buttonAddToFriendSUBSCRIPTIONS_FR);
            buttonAddToFriendSUBSCRIPTIONS_FR.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {                      
                    buttonAddToFriendSUBSCRIPTIONS_FR.setBackgroundResource(R.drawable.b_all_button_round_ring_color_blue);
                    buttonAddToFriendSUBSCRIPTIONS_FR.setTextColor(getResources().getColor(R.color.textColorBlue));
                    }
                });     
            }
        }

         void setValue (String id,String username){
            fieldUsernameITEM_FOR_SUBSCRIPTION_FR.setText(username);
            user_id=id;
        }
    }

    private class SubscriptionRecyclerAdapter extends RecyclerView.Adapter<SubscriptionHolder>{

        @Override
        public SubscriptionHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_for_subscription_fr,parent,false);
                return new SubscriptionHolder(view);
        }
        @Override
        public void onBindViewHolder(final SubscriptionHolder holder, int position) {
                holder.setValue("id","username");
            }
        
        @Override
        public int getItemCount() {
           return array.size()
        }
    }


Впринципе реализация стандартная,может это просто логика работы адаптера такая, я где-то читал что он создает несколько одинаковых объектов viewHolder. В общем как мне обработать нажатия что-бы оно применилось только для одной кнопки?
  • Вопрос задан
  • 158 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Holder используется несколько раз, потому что в этом его суть. Вангую, что когда вы жмете на первый элемент, пятнадцатый ещё не виден. Вьюхи и холдер переиспользуются, а цвет, который вы выставили при нажатии, остался прежним.
Вывод. Если вы меняете какое-либо свойство, вы должны менять его во всех возможных случаях. В вашем примере нужно при баинде холдер выставлять цвет по-умолчанию.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы