首页 > 解决方案 > 使用 ArrayAdapter 替换列表项组件的 Android ListView

问题描述

请检查下面的最后更新,因为我发现了问题但不知道如何解决它

[更新:项目下载链接]非常小它只是一个示例并添加了问题类

我正在为测验创建一个带有 ArrayAdapter 的 ListView。每个问题都有 3 个答案作为单选按钮。问题是当我再次向下或向上滚动时,它会用滚动隐藏的另一个问题的答案替换第一个问题的答案,并用第一个问题的答案替换隐藏的问题答案。

所以假设我有 3 个答案的问题 1:1、2 和 3,并且有问题 5,这是第一个隐藏的问题,有三个答案 10,11 和 12。当我向下滚动查看问题 5 时,我发现它的答案是 1 ,2 和 3 然后当我向上滚动时,我发现问题 5 的答案是 10,11 和 12。为什么会发生这种情况以及如何解决?这是适配器

public class QuestionsAdapter extends ArrayAdapter<Questions> {

public QuestionsAdapter(Activity context, ArrayList<Questions> questions) {
    super(context, 0, questions);
}

@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View listItemView = convertView;
    if (listItemView == null) {
        listItemView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false);
    }
        //styling odd and even items
        if (position % 2 == 1) {
            listItemView.setBackgroundColor(getContext().getResources().getColor(R.color.odd));
        } else {
            listItemView.setBackgroundColor(getContext().getResources().getColor(R.color.even));
        }

        //used ViewHolder to prevent triggering position null issue
        // final because it'll be used inside onClick
        final ViewHolder viewHolder = new ViewHolder();

        try {
            final Questions currentQuestion = getItem(position);

            viewHolder.questionTextView = (TextView) listItemView.findViewById(R.id.q_text);
            viewHolder.questionTextView.setText(currentQuestion.getmQuestionTitle());

            viewHolder.radioGroup = (RadioGroup) listItemView.findViewById(R.id.q_answers);

            viewHolder.firstAnswer = (RadioButton) listItemView.findViewById(R.id.q_option1);

           //MainActivity.answerIdis set to 0 and use it to set different id for each radio to find it inside onClick
           viewHolder.firstAnswer.setText(currentQuestion.getQuestionAnswer1());
            viewHolder.firstAnswer.setId(MainActivity.answerId);
          //increading MainActivity.answerId by 1
            MainActivity.answerId +=1;

            viewHolder.secondAnswer = (RadioButton) listItemView.findViewById(R.id.q_option2);
            viewHolder.secondAnswer.setText(currentQuestion.getQuestionAnswer2());
            viewHolder.secondAnswer.setId(MainActivity.answerId);
            MainActivity.answerId +=1;

            viewHolder.thirdAnswer = (RadioButton) listItemView.findViewById(R.id.q_option3);
            viewHolder.thirdAnswer.setText(currentQuestion.getQuestionAnswer3());
            viewHolder.thirdAnswer.setId(MainActivity.answerId);
            MainActivity.answerId +=1;

            final TextView resultTextView = (TextView) listItemView.findViewById(R.id.result_text);


        } catch (Exception e) {
            e.printStackTrace();
        }

    return listItemView;
}

  private class ViewHolder {
    TextView questionTextView;
    RadioGroup radioGroup;
    RadioButton firstAnswer, secondAnswer,thirdAnswer;
  }
}

问题类:

public class Questions {

  private String mQuestionTitle,mQuestionAnswer1, mQuestionAnswer2, mQuestionAnswer3, mCorrect ;

  public Questions(String questionTitle, String questionAnswer1, String questionAnswer2, String questionAnswer3,
                 String correct){
    mQuestionTitle = questionTitle;
    mQuestionAnswer1 = questionAnswer1;
    mQuestionAnswer2 = questionAnswer2;
    mQuestionAnswer3 = questionAnswer3;
    mCorrect = correct;
  }

  public String getQuestionTitle(){
    return mQuestionTitle;
  }

  public String getQuestionAnswer1(){
    return mQuestionAnswer1;
  }

  public String getQuestionAnswer2(){
    return mQuestionAnswer2;
  }

  public String getQuestionAnswer3(){
    return mQuestionAnswer3;
  }

  public String getCorrect(){
    return mCorrect;
  }

}

[更新]尝试与第一个单选按钮一起再次调试和显示问题我发现问题标题与我与单选按钮一起显示的问题不同

String question = currentQuestion.getQuestionTitle();
String option_1 = currentQuestion.getQuestionAnswer1();
String option_2 = currentQuestion.getQuestionAnswer2();
String option_3 = currentQuestion.getQuestionAnswer3();
viewHolder.questionTextView = (TextView) listItemView.findViewById(R.id.q_text);
viewHolder.questionTextView.setText(question);
viewHolder.radioGroup = (RadioGroup) listItemView.findViewById(R.id.q_answers);
viewHolder.firstAnswer = (RadioButton) listItemView.findViewById(R.id.q_option1);
viewHolder.firstAnswer.setText(option_1 + ":" + question);
viewHolder.firstAnswer.setId(MainActivity.answerId);
MainActivity.answerId +=1;

在此处输入图像描述

真正的问题是, 当我将答案的 id 设置为 0 并开始将其增加 1 时,当我再次向下滑动时,它再次返回 0。如何保存最后一个整数值并不断增加它以将不同的 id 设置为单选按钮?

截图

打开应用程序我找到第一个问题的正确答案

滚动第一个隐藏的问题后,我发现它的答案已被第一个问题的答案取代

再次向上滚动,我发现第一个问题的答案已被问题 5 的答案取代

标签: androidandroid-listviewandroid-arrayadapter

解决方案


推荐阅读