В моем приложении есть тест. В каждом из вопросов можно выбрать один из 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'ов. Буду благодарна за любые догадки, что это может быть или советы, как можно реализовать такой функционал по другому.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
у меня имеется база данных SQLite в которую я добавляю и удаляю данные по принципу описанному ниже
Объекты находятся в куче, методы и локальные переменные в стеке, стек со всеми методами начинает выполняться при создании объекта, значит...