RecyclerView неправильно отображает item

118
11 апреля 2021, 11:50

В моем приложении есть тест. В каждом из вопросов можно выбрать один из 5 вариантов ответа. При этом выбранный вариант выделяется серым цветом(если до этого был выделен другой, то этот другой обесцвечивается) и информация о ответе передается в базу данных SQLite. Конкретно эта часть работает нормально. Но если прокрутить RecyclerView, в других вопросах почему то появляются выделенные серым светом варианты, а кое где даже несколько выделенных. При этом в базе данных эти ответы не появляются.

Holder:

private class QuestionHolder extends RecyclerView.ViewHolder {
        private Question mQuestion;
        private TextView mQuestionText;
        private ImageView mQuestionImage;
        private TextView mAnswer1;
        private TextView mAnswer2;
        private TextView mAnswer3;
        private TextView mAnswer4;
        private TextView mAnswer5;
        private LinearLayout mButtonAn1;
        private LinearLayout mButtonAn2;
        private LinearLayout mButtonAn3;
        private LinearLayout mButtonAn4;
        private LinearLayout mButtonAn5;
        public QuestionHolder(View v, int part) {
            super(v);
            mQuestionText = itemView.findViewById(R.id.question_text);
            mQuestionImage = itemView.findViewById(R.id.question_image);
            mUserAnswer = itemView.findViewById(R.id.user_answer);
                    mAnswer1 = itemView.findViewById(R.id.An1);
                    mAnswer2 = itemView.findViewById(R.id.An2);
                    mAnswer3 = itemView.findViewById(R.id.An3);
                    mAnswer4 = itemView.findViewById(R.id.An4);
                    mAnswer5 = itemView.findViewById(R.id.An5);
                    mButtonAn1 = itemView.findViewById(R.id.An1_Button);
                    mButtonAn2 = itemView.findViewById(R.id.An2_Button);
                    mButtonAn3 = itemView.findViewById(R.id.An3_Button);
                    mButtonAn4 = itemView.findViewById(R.id.An4_Button);
                    mButtonAn5 = itemView.findViewById(R.id.An5_Button);
            }
        }
        public void bind(final Question question) {
            mQuestion = question;
            SubjectParent.getSubjectSingleton(getActivity(), SUBJECT).updateQuestion(mQuestion, TEST);
            mQuestionText.setText(mQuestion.getText());
            mQuestionImage.setImageBitmap(mQuestion.getBitmap())
                    mAnswer1.setText(mQuestion.getAnswer1());
                    mAnswer2.setText(mQuestion.getAnswer2());
                    mAnswer3.setText(mQuestion.getAnswer3());
                    mAnswer4.setText(mQuestion.getAnswer4());
                    mAnswer5.setText(mQuestion.getAnswer5());
                    if (mQuestion.getUserAnswer() != null) {
                        if (mQuestion.getUserAnswer().equals(mQuestion.getAnswer1())) {
                            mButtonAn1.setBackgroundColor(getResources().getColor(R.color.colorGray));
                        }
                        if (mQuestion.getUserAnswer().equals(mQuestion.getAnswer2())) {
                            mButtonAn2.setBackgroundColor(getResources().getColor(R.color.colorGray));
                        }
                        if (mQuestion.getUserAnswer().equals(mQuestion.getAnswer3())) {
                            mButtonAn3.setBackgroundColor(getResources().getColor(R.color.colorGray));
                        }
                        if (mQuestion.getUserAnswer().equals(mQuestion.getAnswer4())) {
                            mButtonAn4.setBackgroundColor(getResources().getColor(R.color.colorGray));
                        }
                        if (mQuestion.getUserAnswer().equals(mQuestion.getAnswer5())) {
                            mButtonAn5.setBackgroundColor(getResources().getColor(R.color.colorGray));
                        }
                    }
                    mButtonAn1.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            updateUserAnswer();
                            mButtonAn1.setBackgroundColor(getResources().getColor(R.color.colorGray));
                            mQuestion.setUserAnswer(mQuestion.getAnswer1());
                            SubjectParent.getSubjectSingleton(getActivity(), SUBJECT).updateQuestion(mQuestion, TEST);
                        }
                    });
                    mButtonAn2.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            updateUserAnswer();
                            mButtonAn2.setBackgroundColor(getResources().getColor(R.color.colorGray));
                            mQuestion.setUserAnswer(mQuestion.getAnswer2());
                            SubjectParent.getSubjectSingleton(getActivity(), SUBJECT).updateQuestion(mQuestion, TEST);
                        }
                    });
                    mButtonAn3.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            updateUserAnswer();
                            mButtonAn3.setBackgroundColor(getResources().getColor(R.color.colorGray));
                            mQuestion.setUserAnswer(mQuestion.getAnswer3());
                            SubjectParent.getSubjectSingleton(getActivity(), SUBJECT).updateQuestion(mQuestion, TEST);
                        }
                    });
                    mButtonAn4.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            updateUserAnswer();
                            mButtonAn4.setBackgroundColor(getResources().getColor(R.color.colorGray));
                            mQuestion.setUserAnswer(mQuestion.getAnswer4());
                            SubjectParent.getSubjectSingleton(getActivity(), SUBJECT).updateQuestion(mQuestion, TEST);
                        }
                    });
                    mButtonAn5.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            updateUserAnswer();
                            mButtonAn5.setBackgroundColor(getResources().getColor(R.color.colorGray));
                            mQuestion.setUserAnswer(mQuestion.getAnswer5());
                            SubjectParent.getSubjectSingleton(getActivity(), SUBJECT).updateQuestion(mQuestion, TEST);
                        }
                    });
        private void updateUserAnswer() {
            mButtonAn1.setBackgroundColor(getResources().getColor(R.color.colorWhite));
            mButtonAn2.setBackgroundColor(getResources().getColor(R.color.colorWhite));
            mButtonAn3.setBackgroundColor(getResources().getColor(R.color.colorWhite));
            mButtonAn4.setBackgroundColor(getResources().getColor(R.color.colorWhite));
            mButtonAn5.setBackgroundColor(getResources().getColor(R.color.colorWhite));
        }

}

Adapter:

public class QuestionAdapter extends RecyclerView.Adapter<QuestionHolder> {
    private List<Question> mQuestions;
    public QuestionAdapter(List<Question> questions) {
        mQuestions = questions;
    }
    @NonNull
    @Override
    public QuestionHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
        View v = layoutInflater.inflate(R.layout.list_item_a_question, viewGroup, false);
        return new QuestionHolder(v, viewType);
    }
    @Override
    public void onBindViewHolder(@NonNull QuestionHolder questionHolder, int i) {
        Question question = mQuestions.get(i);
        questionHolder.bind(question);
    }
    @Override
    public int getItemCount() {
        return mQuestions.size();
    }
    public void setQuestions(List<Question> questions) {
        mQuestions = questions;
    }
}

Я уже проходилась с отладчиком по коду и вот эта часть не вызывается перед появлением неправильных item, хотя, по идее, по другому они никак не могут изменить цвет:

if (mQuestion.getUserAnswer() != null) {
                    if (mQuestion.getUserAnswer().equals(mQuestion.getAnswer1())) {
                        mButtonAn1.setBackgroundColor(getResources().getColor(R.color.colorGray));
                    }

Также если перезайти в активность, ошибка исчезает. Я не вижу других вариантов, кроме неправильной переработки RecyclerView item'ов. Буду благодарна за любые догадки, что это может быть или советы, как можно реализовать такой функционал по другому.

READ ALSO
Как получить Uri записи SQLite Android

Как получить Uri записи SQLite Android

у меня имеется база данных SQLite в которую я добавляю и удаляю данные по принципу описанному ниже

125
Вопрос по стеку и объектам в java

Вопрос по стеку и объектам в java

Объекты находятся в куче, методы и локальные переменные в стеке, стек со всеми методами начинает выполняться при создании объекта, значит...

138
Контролер не изменяет .jsp Spring MVC + Tomcat

Контролер не изменяет .jsp Spring MVC + Tomcat

Контролер возвращает не изменяетjsp файл

122
Неверное сравнение

Неверное сравнение

Есть след код

124