Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 滚动后,回收器视图中的卡片视图混乱不堪_Android_Android Layout_Android Cardview_Android Recyclerview - Fatal编程技术网

Android 滚动后,回收器视图中的卡片视图混乱不堪

Android 滚动后,回收器视图中的卡片视图混乱不堪,android,android-layout,android-cardview,android-recyclerview,Android,Android Layout,Android Cardview,Android Recyclerview,我正在构建一个Android问答应用程序。问题保存在SQLite数据库中,并随机挑选出来 对于回答的每个问题,我都将答案存储在字符串数组列表中。最后,我有一个RecyclerView,显示包含问题和答案的卡片视图。我将两个列表传递给构造函数-第一个列表包含问题(带答案),第二个列表包含选定的答案 如果用户的答案是正确的,则该答案为绿色。如果答案不正确,则该答案为红色,正确答案为绿色 当显示结果时,一切都是正确的。但在向下滚动,使卡不再可见,然后再向上滚动后,颜色不再正确 屏幕截图: “Pravi

我正在构建一个Android问答应用程序。问题保存在SQLite数据库中,并随机挑选出来

对于回答的每个问题,我都将答案存储在字符串数组列表中。最后,我有一个RecyclerView,显示包含问题和答案的卡片视图。我将两个列表传递给构造函数-第一个列表包含问题(带答案),第二个列表包含选定的答案

如果用户的答案是正确的,则该答案为绿色。如果答案不正确,则该答案为红色,正确答案为绿色

当显示结果时,一切都是正确的。但在向下滚动,使卡不再可见,然后再向上滚动后,颜色不再正确

屏幕截图: “Pravilen”表示正确,“Napačen”表示不正确/错误。在所有4个案例中,我都选择了最下面的答案(即使答案不正确)

有人知道为什么会这样吗?在过去的两天里,我一直在努力解决这个问题,但我不知道哪里出了问题。提前谢谢

回收器视图适配器代码(很抱歉,格式可能不正确):

公共类RVAdapter扩展了RecyclerView.Adapter{ 列表问题列表; ArrayList选择的答案; 公共静态类问题ViewHolder扩展了RecyclerView.ViewHolder{ 卡德维尤; 文本视图问题; 文本视图回答1; 文本视图回答2; 文本视图回答3; 文本视图回答4; 问题视图持有者(查看项目视图){ 超级(项目视图); cardView=(cardView)itemView.findViewById(R.id.cardView); 问题=(TextView)itemView.findViewById(R.id.resultQuestion); answer1=(TextView)itemView.findViewById(R.id.resultAnswer1); answer2=(TextView)itemView.findViewById(R.id.resultAnswer2); answer3=(TextView)itemView.findViewById(R.id.resultAnswer3); answer4=(TextView)itemView.findViewById(R.id.resultAnswer4); } } 公共RVAdapter(列表问题列表、阵列列表选择答案){ this.questionList=问题列表; this.selectedAnswers=selectedAnswers; } @凌驾 公共问题ViewHolder onCreateViewHolder(ViewGroup ViewGroup,int viewType){ View View=LayoutInflater.from(viewGroup.getContext()).flate(R.layout.card_视图,viewGroup,false); 返回新问题视图持有者(视图); } @凌驾 公共无效onBindViewHolder(问题视图持有人,内部位置){ holder.question.setText(questionList.get(position.getQuestion()); String answer1=questionList.get(position.getAnswer1(); String answer2=questionList.get(position.getAnswer2(); String answer3=questionList.get(position.getAnswer3(); String answer4=questionList.get(position.getAnswer4(); String correctAnswer=questionList.get(position.getCorrectAnswer(); 字符串selectedAnswer=selectedAnswers.get(位置); if(answer1==null){ 持有者。回答1。设置可见性(视图。消失); }否则{ 支架.回答1.设置可见性(视图.可见); holder.answer1.setText(answer1); 如果(答案1.等于(正确答案)){ 持有者。回答1。setTextColor(颜色。绿色); }else if(回答1.等于(选择回答)){ 持有者。回答1。setTextColor(颜色。红色); } } if(answer2==null){ holder.answer2.setVisibility(视图已消失); }否则{ 支架。应答2。设置可见性(视图。可见); holder.answer2.setText(answer2); 如果(回答2.等于(正确回答)){ 持有者。回答2。setTextColor(颜色。绿色); }else if(回答2.等于(选择回答)){ 持有者。回答2。setTextColor(颜色。红色); } } if(answer3==null){ 持有者。回答3。设置可见性(视图。消失); }否则{ 支架.回答3.设置可见性(视图.可见); holder.answer3.setText(answer3); 如果(答案3.等于(正确答案)){ 持有者。回答者3。setTextColor(颜色。绿色); }else if(回答3.等于(选择回答)){ 持有者。回答3。setTextColor(颜色。红色); } } if(answer4==null){ 持有者。回答4。设置可见性(视图。消失); }否则{ 支架.回答4.设置可见性(视图.可见); holder.answer4.setText(answer4); 如果(答案4.等于(正确答案)){ 持有者。回答4。setTextColor(颜色。绿色); }else if(回答4.等于(选择回答)){ 持有者。回答4。setTextColor(颜色。红色); } } }
您可以在
onBindViewHolder
中设置标记:

@Override
public void onBindViewHolder(QuestionViewHolder holder, int position) {
    holder.question.setText(questionList.get(position).getQuestion());
//add tags for all ViewHolder items
    holder.question.setTag(questionList.get(position));
    String answer1 = questionList.get(position).getAnswer1();
    String answer2 = questionList.get(position).getAnswer2();
    String answer3 = questionList.get(position).getAnswer3();
    String answer4 = questionList.get(position).getAnswer4();
    String correctAnswer = questionList.get(position).getCorrectAnswer();
    String selectedAnswer = selectedAnswers.get(position);

    if (answer1 == null) {
        holder.answer1.setVisibility(View.GONE);
    } else {
        holder.answer1.setVisibility(View.VISIBLE);
        holder.answer1.setText(answer1);
        if (answer1.equals(correctAnswer)) {
            holder.answer1.setTextColor(Color.GREEN);
        } else if (answer1.equals(selectedAnswer)) {
            holder.answer1.setTextColor(Color.RED);
        }
    }
    if (answer2 == null) {
        holder.answer2.setVisibility(View.GONE);
    } else {
        holder.answer2.setVisibility(View.VISIBLE);
        holder.answer2.setText(answer2);
        if (answer2.equals(correctAnswer)) {
            holder.answer2.setTextColor(Color.GREEN);
        } else if (answer2.equals(selectedAnswer)) {
            holder.answer2.setTextColor(Color.RED);
        }
    }
    if (answer3 == null) {
        holder.answer3.setVisibility(View.GONE);
    } else {
        holder.answer3.setVisibility(View.VISIBLE);
        holder.answer3.setText(answer3);
        if (answer3.equals(correctAnswer)) {
            holder.answer3.setTextColor(Color.GREEN);
        } else if (answer3.equals(selectedAnswer)) {
            holder.answer3.setTextColor(Color.RED);
        }
    }
    if (answer4 == null) {
        holder.answer4.setVisibility(View.GONE);
    } else {
        holder.answer4.setVisibility(View.VISIBLE);
        holder.answer4.setText(answer4);
        if (answer4.equals(correctAnswer)) {
            holder.answer4.setTextColor(Color.GREEN);
        } else if (answer4.equals(selectedAnswer)) {
            holder.answer4.setTextColor(Color.RED);
        }
    }

您可以在
onBindViewHolder
中设置标记:

@Override
public void onBindViewHolder(QuestionViewHolder holder, int position) {
    holder.question.setText(questionList.get(position).getQuestion());
//add tags for all ViewHolder items
    holder.question.setTag(questionList.get(position));
    String answer1 = questionList.get(position).getAnswer1();
    String answer2 = questionList.get(position).getAnswer2();
    String answer3 = questionList.get(position).getAnswer3();
    String answer4 = questionList.get(position).getAnswer4();
    String correctAnswer = questionList.get(position).getCorrectAnswer();
    String selectedAnswer = selectedAnswers.get(position);

    if (answer1 == null) {
        holder.answer1.setVisibility(View.GONE);
    } else {
        holder.answer1.setVisibility(View.VISIBLE);
        holder.answer1.setText(answer1);
        if (answer1.equals(correctAnswer)) {
            holder.answer1.setTextColor(Color.GREEN);
        } else if (answer1.equals(selectedAnswer)) {
            holder.answer1.setTextColor(Color.RED);
        }
    }
    if (answer2 == null) {
        holder.answer2.setVisibility(View.GONE);
    } else {
        holder.answer2.setVisibility(View.VISIBLE);
        holder.answer2.setText(answer2);
        if (answer2.equals(correctAnswer)) {
            holder.answer2.setTextColor(Color.GREEN);
        } else if (answer2.equals(selectedAnswer)) {
            holder.answer2.setTextColor(Color.RED);
        }
    }
    if (answer3 == null) {
        holder.answer3.setVisibility(View.GONE);
    } else {
        holder.answer3.setVisibility(View.VISIBLE);
        holder.answer3.setText(answer3);
        if (answer3.equals(correctAnswer)) {
            holder.answer3.setTextColor(Color.GREEN);
        } else if (answer3.equals(selectedAnswer)) {
            holder.answer3.setTextColor(Color.RED);
        }
    }
    if (answer4 == null) {
        holder.answer4.setVisibility(View.GONE);
    } else {
        holder.answer4.setVisibility(View.VISIBLE);
        holder.answer4.setText(answer4);
        if (answer4.equals(correctAnswer)) {
            holder.answer4.setTextColor(Color.GREEN);
        } else if (answer4.equals(selectedAnswer)) {
            holder.answer4.setTextColor(Color.RED);
        }
    }

我以一种不同的方式解决了您的问题,希望它能有所帮助

public class Question {
List<String> options = new ArrayList<String>();
String correctAnswer;
String question;

public List<String> getOptions() {
    return options;
}

public String getCorrectAnswer() {
    return correctAnswer;
}

public String getQuestion() {
    return question;
}

public void setOptions(List<String> options) {
    this.options = options;
}

public void setCorrectAnswer(String correctAnswer) {
    this.correctAnswer = correctAnswer;
}

public void setQuestion(String question) {
    this.question = question;
  }
}


public class selectedAnswer {
String selectedAnswer;

public String getSelectedAnswer() {
    return selectedAnswer;
}

public void setSelectedAnswer(String selectedAnswer) {
    this.selectedAnswer = selectedAnswer;
 }
}

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.QuestionViewHolder> {

List<Question> questionList = new ArrayList<>();
List<selectedAnswer> selectedAnswers = new ArrayList<>();

public static class QuestionViewHolder extends RecyclerView.ViewHolder {
    CardView cardView;
    TextView question;
    TextView answer1;
    TextView answer2;
    TextView answer3;
    TextView answer4;

    QuestionViewHolder(View itemView) {
        super(itemView);
        cardView = (CardView) itemView.findViewById(R.id.cardView);
        question = (TextView) itemView.findViewById(R.id.resultQuestion);
        answer1 = (TextView) itemView.findViewById(R.id.resultAnswer1);
        answer2 = (TextView) itemView.findViewById(R.id.resultAnswer2);
        answer3 = (TextView) itemView.findViewById(R.id.resultAnswer3);
        answer4 = (TextView) itemView.findViewById(R.id.resultAnswer4);
    }
}


public RVAdapter(List<Question> questionList, List<selectedAnswer> selectedAnswers) {
    this.questionList = questionList;
    this.selectedAnswers = selectedAnswers;
}


@Override
public QuestionViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_view, viewGroup, false);
    return new QuestionViewHolder(view);
}


@Override
public void onBindViewHolder(QuestionViewHolder holder, int position) {
    holder.answer1.setVisibility(View.GONE);
    holder.answer2.setVisibility(View.GONE);
    holder.answer3.setVisibility(View.GONE);
    holder.answer4.setVisibility(View.GONE);
    holder.question.setText(questionList.get(position).getQuestion());
    if(questionList.get(position).getCorrectAnswer() == selectedAnswers.get(position).getSelectedAnswer())
    {
        holder.answer1.setText(selectedAnswers.get(position).getSelectedAnswer());
        holder.answer1.setVisibility(View.VISIBLE);
        holder.answer1.setTextColor(Color.GREEN);
        questionList.get(position).getOptions().remove(position);
    }

    else
    {
        for(int i=0;i<questionList.get(position).getOptions().size();i++) {
            if(selectedAnswers.get(position).getSelectedAnswer() == questionList.get(position).getOptions().get(i))
            {
                holder.answer2.setText(selectedAnswers.get(position).getSelectedAnswer());
                holder.answer2.setVisibility(View.VISIBLE);
                holder.answer2.setTextColor(Color.RED);
                questionList.get(position).getOptions().remove(position);
            }
        }
    }
    if(questionList.get(position).getOptions().size() != 0)
    {
        holder.answer3.setText(questionList.get(position).getOptions().get(2));
        holder.answer3.setVisibility(View.VISIBLE);
        holder.answer4.setText(questionList.get(position).getOptions().get(3));
        holder.answer4.setVisibility(View.VISIBLE);
    }

  }
}
公开课问题{
列表选项=新建ArrayList();
字符串正确答案;
字符串问题;
公共列表getOptions(){
返回选项;
}
公共字符串getCorrectAnswer(){
返回正确答案;
}
公共字符串getQuestion(){
返回问题;
}
公共无效设置选项(列表选项){
this.options=选项;
}
公共无效setCorrectAnswer(字符串correctAnswer){
this.correctAnswer=correctAnswer;
}
公共问题(字符串问题){
这个问题=问题;
}
}
公共类选择回答{
字符串选择回答;
公共字符串getSelectedAnswer(){
返回所选答案;
}
public void setSelectedAnswer(字符串selectedAnswer){
this.selectedAnswer=selectedAnswer;
}
}
公共类RVAdapter扩展了RecyclerView.Adapter{
List questionList=新建ArrayList();
List selectedAnswers=new ArrayList();
公共静态类问题ViewHolder扩展了RecyclerView.ViewHolder{
卡德维尤;
文本视图问题;
文本视图回答1;
文本视图回答2;
文本视图回答3;
文本视图回答4;
问题视图持有者(查看项目视图){
超级(项目视图);
cardView=(cardView)itemView.findViewById(R.id.ca
@Override
public void onBindViewHolder(QuestionViewHolder holder, int position) {

    String question = questionList.get(position).getQuestion();
    String answer1 = questionList.get(position).getAnswer1();
    String answer2 = questionList.get(position).getAnswer2();
    String answer3 = questionList.get(position).getAnswer3();
    String answer4 = questionList.get(position).getAnswer4();
    String correctAnswer = questionList.get(position).getCorrectAnswer();
    String selectedAnswer = selectedAnswers.get(position);

    // Clear any previous attributes.
    holder.question.setText(null);
    holder.answer1.setText(null);
    holder.answer2.setText(null);
    holder.answer3.setText(null);
    holder.answer4.setText(null);
    holder.answer1.setTextColor(Color.BLACK);
    holder.answer2.setTextColor(Color.BLACK);
    holder.answer3.setTextColor(Color.BLACK);
    holder.answer4.setTextColor(Color.BLACK);

    holder.question.setText(question);
    // ... if statements follow below ...