滚动后回收站视图内的卡片视图混乱
Card views inside a recycler view mess up after scrolling
我正在构建一个 Android 测验应用程序。题目保存在 SQLite 数据库中,随机抽取。
对于每个回答的问题,我将该答案存储在一个字符串数组列表中。最后,我有一个显示包含问题和答案的卡片视图的 RecyclerView。我将两个列表传递给构造函数 - 第一个包含问题(带答案),第二个包含选定的答案。
如果用户的答案正确,则该答案为绿色。如果不正确,则该答案为红色,正确答案为绿色。
当结果显示时,一切都是正确的。但是在向下滚动以致无法再看到卡片然后向上滚动后,颜色不再正确。
截图:
"Pravilen" 表示正确,"Napačen" 表示 incorrect/wrong。在所有 4 个案例中,我都选择了底部的答案(即使它不正确)。
有谁知道为什么会这样?在过去的两天里,我一直在尝试解决这个问题,但我只是看不出哪里出了问题。提前致谢。
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);
}
}
}
您可以在 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);
}
}
}
起初我尝试使用 ListView,但效果不是很好。然后我在谷歌上又搜索了一些,但仍然一无所获。
为了解决我的问题,我在 之前 在我的 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 ...
我遇到了同样的问题,为此我找到的唯一解决方案是:
holder.setIsRecyclable(假);
我遇到过这个问题,并意识到在我的情况下,我在 public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {}
中切换视图可见性
所以发生的事情是由于我的错误代码,有时一些 viewholders 被完全隐藏,因此没有被删除或回收。这导致了 recylerview 中的随机性。因此,如果您有一些更改视图可见性的代码,请将其删除并测试问题是否仍然存在。
我正在构建一个 Android 测验应用程序。题目保存在 SQLite 数据库中,随机抽取。
对于每个回答的问题,我将该答案存储在一个字符串数组列表中。最后,我有一个显示包含问题和答案的卡片视图的 RecyclerView。我将两个列表传递给构造函数 - 第一个包含问题(带答案),第二个包含选定的答案。
如果用户的答案正确,则该答案为绿色。如果不正确,则该答案为红色,正确答案为绿色。
当结果显示时,一切都是正确的。但是在向下滚动以致无法再看到卡片然后向上滚动后,颜色不再正确。
截图: "Pravilen" 表示正确,"Napačen" 表示 incorrect/wrong。在所有 4 个案例中,我都选择了底部的答案(即使它不正确)。
有谁知道为什么会这样?在过去的两天里,我一直在尝试解决这个问题,但我只是看不出哪里出了问题。提前致谢。
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);
}
}
}
您可以在 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);
}
}
}
起初我尝试使用 ListView,但效果不是很好。然后我在谷歌上又搜索了一些,但仍然一无所获。
为了解决我的问题,我在 之前 在我的 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 ...
我遇到了同样的问题,为此我找到的唯一解决方案是:
holder.setIsRecyclable(假);
我遇到过这个问题,并意识到在我的情况下,我在 public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {}
所以发生的事情是由于我的错误代码,有时一些 viewholders 被完全隐藏,因此没有被删除或回收。这导致了 recylerview 中的随机性。因此,如果您有一些更改视图可见性的代码,请将其删除并测试问题是否仍然存在。