В моем приложении есть тест. В каждом из вопросов можно выбрать один из 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'ов. Буду благодарна за любые догадки, что это может быть или советы, как можно реализовать такой функционал по другому.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
у меня имеется база данных SQLite в которую я добавляю и удаляю данные по принципу описанному ниже
Объекты находятся в куче, методы и локальные переменные в стеке, стек со всеми методами начинает выполняться при создании объекта, значит...