滚动

时间:2016-05-01 12:47:51

标签: android android-layout android-recyclerview android-cardview recycler-adapter

我正在构建Android测验应用。问题保存在SQLite数据库中并随机挑选出来。

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

如果用户的回答正确,则该答案显示为绿色。如果不正确,该答案将显示为红色,正确答案将显示为绿色。

显示结果时,一切正确。但是在向下滚动以便无法再看到卡然后再向上滚动时,颜色不再正确。

截图: “Pravilen”意味着正确,“Napačen”意味着错误/错误。在所有4个案例中,我选择了最底层的答案(即使它不正确)。

Before scrolling

After scrolling

有谁知道为什么会这样?在过去的两天里我一直试图解决这个问题,但我只是看不出它出了什么问题。提前谢谢。

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

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

List<Question> questionList;
ArrayList<String> selectedAnswers;

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, ArrayList<String> 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.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();
    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);
        }
    }
}

5 个答案:

答案 0 :(得分:2)

起初我尝试使用ListView,但它并不是那么棒。然后我用Google搜索了一些,但仍然没有找到任何东西。

要解决我的问题,我将文本重置为null,并将颜色设置为黑色,之后在我的onBindViewHolder中设置文本和颜色。这是代码:

@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 ...

答案 1 :(得分:0)

您可以在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);
        }
    }

答案 2 :(得分:0)

我已经以一种不同的方式实现了您的问题,希望它有所帮助。

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);
    }

  }
}

答案 3 :(得分:0)

我遇到了同样的问题,我找到的唯一解决方案是:

holder.setIsRecyclable(假);

答案 4 :(得分:0)

我遇到过这个问题,并意识到在我的情况下,我正在切换public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {}内的视图可见性

所以发生的事情是由于我的代码不好,有时一些观众被完全隐藏,因此没有被删除或重新列入。这导致了recylerview中的随机性。因此,如果您有一些代码可以更改视图可见性,那么请删除它并测试问题是否仍然存在。