简体   繁体   English

Android ListView和带有ViewHolder的自定义适配器

[英]Android ListView and custom adapter with ViewHolder

I'm having a problem with my ListView adapter displaying items in my ArrayList... 我的ListView适配器在ArrayList中显示项目时遇到问题...

For the most part, it seems to work... the view is correct for each item... however, the validation seems to get screwed up when I implement the (convertView == null)... 在大多数情况下,它似乎可以正常工作……每个项目的视图都是正确的……但是,当我实现(convertView == null)时,验证似乎搞砸了……

Without this... the displays work perfectly with all of the correct validation... but as soon as I put in the (convertView == null) section, none of my validation works correctly... It's the oddest thing. 没有这个...显示与所有正确的验证都可以完美地工作...但是一旦我放入(convertView == null)部分,我的任何验证都无法正常工作...这是最奇怪的事情。

Works perfectly... 完美运作...

public View getView(int position, View convertView, ViewGroup parent)
    {
        // View rowView = convertView;
        final ViewHolder viewHolder;

            LayoutInflater theInflater = LayoutInflater.from(context);
            convertView = theInflater.inflate(R.layout.score_layout, null);

            viewHolder = new ViewHolder();

            viewHolder.textViewScoreQuestion = (TextView) convertView.findViewById(R.id.textViewScoreQuestion);
            viewHolder.checkBoxScoreOne = (CheckBox) convertView.findViewById(R.id.checkBoxScoreOne);
            viewHolder.checkBoxScoreTwo = (CheckBox) convertView.findViewById(R.id.checkBoxScoreTwo);
            viewHolder.checkBoxScoreThree = (CheckBox) convertView.findViewById(R.id.checkBoxScoreThree);
            viewHolder.checkBoxScoreFour = (CheckBox) convertView.findViewById(R.id.checkBoxScoreFour);

            Questions question = questionsInOrder.get(position);
            String givenAnswer = answerChoices.get(position);

            viewHolder.textViewScoreQuestion.setText(question.getQuestion());
            viewHolder.checkBoxScoreOne.setText(question.getAnswer1());
            viewHolder.checkBoxScoreTwo.setText(question.getAnswer2());
            viewHolder.checkBoxScoreThree.setText(question.getAnswer3());
            viewHolder.checkBoxScoreFour.setText(question.getAnswer4());

            // display incorrect answers as red, and correct answers as blue
            if (givenAnswer.equals(question.getAnswer1()) && !(givenAnswer.equals(question.getCorrect())))
            {
                viewHolder.checkBoxScoreOne.setTextColor(context.getResources().getColor(R.color.red));
            }
            if (givenAnswer.equals(question.getAnswer1()) && (givenAnswer.equals(question.getCorrect())))
            {
                viewHolder.checkBoxScoreOne.setTextColor(context.getResources().getColor(R.color.holo_blue_dark));
            }

            if (givenAnswer.equals(question.getAnswer2()) && !(givenAnswer.equals(question.getCorrect())))
            {
                viewHolder.checkBoxScoreTwo.setTextColor(context.getResources().getColor(R.color.red));
            }
            if (givenAnswer.equals(question.getAnswer2()) && (givenAnswer.equals(question.getCorrect())))
            {
                viewHolder.checkBoxScoreTwo.setTextColor(context.getResources().getColor(R.color.holo_blue_dark));
            }

            if (givenAnswer.equals(question.getAnswer3()) && !(givenAnswer.equals(question.getCorrect())))
            {
                viewHolder.checkBoxScoreThree.setTextColor(context.getResources().getColor(R.color.red));
            }
            if (givenAnswer.equals(question.getAnswer3()) && (givenAnswer.equals(question.getCorrect())))
            {
                viewHolder.checkBoxScoreThree.setTextColor(context.getResources().getColor(R.color.holo_blue_dark));
            }

            if (givenAnswer.equals(question.getAnswer4()) && !(givenAnswer.equals(question.getCorrect())))
            {
                viewHolder.checkBoxScoreFour.setTextColor(context.getResources().getColor(R.color.red));
            }
            if (givenAnswer.equals(question.getAnswer4()) && (givenAnswer.equals(question.getCorrect())))
            {
                viewHolder.checkBoxScoreFour.setTextColor(context.getResources().getColor(R.color.holo_blue_dark));
            }

            // check all of the correct answers
            if (question.getAnswer1().equals(question.getCorrect()))
            {
                viewHolder.checkBoxScoreOne.setChecked(true);
            }
            if (question.getAnswer2().equals(question.getCorrect()))
            {
                viewHolder.checkBoxScoreTwo.setChecked(true);
            }
            if (question.getAnswer3().equals(question.getCorrect()))
            {
                viewHolder.checkBoxScoreThree.setChecked(true);
            }
            if (question.getAnswer4().equals(question.getCorrect()))
            {
                viewHolder.checkBoxScoreFour.setChecked(true);
            }

        return convertView;
    }

Validation screws up: 验证螺丝:

 public View getView(int position, View convertView, ViewGroup parent)
    {
        // View rowView = convertView;
        final ViewHolder viewHolder;

        if (convertView == null)
        {
            LayoutInflater theInflater = LayoutInflater.from(context);
            convertView = theInflater.inflate(R.layout.score_layout, null);
            viewHolder = new ViewHolder();

            viewHolder.textViewScoreQuestion = (TextView) convertView.findViewById(R.id.textViewScoreQuestion);
            viewHolder.checkBoxScoreOne = (CheckBox) convertView.findViewById(R.id.checkBoxScoreOne);
            viewHolder.checkBoxScoreTwo = (CheckBox) convertView.findViewById(R.id.checkBoxScoreTwo);
            viewHolder.checkBoxScoreThree = (CheckBox) convertView.findViewById(R.id.checkBoxScoreThree);
            viewHolder.checkBoxScoreFour = (CheckBox) convertView.findViewById(R.id.checkBoxScoreFour);

            convertView.setTag(viewHolder);
        }
        else
        {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        Questions question = questionsInOrder.get(position);
        String givenAnswer = answerChoices.get(position);

        viewHolder.textViewScoreQuestion.setText(question.getQuestion());
        viewHolder.checkBoxScoreOne.setText(question.getAnswer1());
        viewHolder.checkBoxScoreTwo.setText(question.getAnswer2());
        viewHolder.checkBoxScoreThree.setText(question.getAnswer3());
        viewHolder.checkBoxScoreFour.setText(question.getAnswer4());


        // display incorrect answers as red, and correct answers as blue
        if (givenAnswer.equals(question.getAnswer1()) && !(givenAnswer.equals(question.getCorrect())))
        {
            viewHolder.checkBoxScoreOne.setTextColor(context.getResources().getColor(R.color.red));
        }
        if (givenAnswer.equals(question.getAnswer1()) && (givenAnswer.equals(question.getCorrect())))
        {
            viewHolder.checkBoxScoreOne.setTextColor(context.getResources().getColor(R.color.holo_blue_dark));
        }

        if (givenAnswer.equals(question.getAnswer2()) && !(givenAnswer.equals(question.getCorrect())))
        {
            viewHolder.checkBoxScoreTwo.setTextColor(context.getResources().getColor(R.color.red));
        }
        if (givenAnswer.equals(question.getAnswer2()) && (givenAnswer.equals(question.getCorrect())))
        {
            viewHolder.checkBoxScoreTwo.setTextColor(context.getResources().getColor(R.color.holo_blue_dark));
        }

        if (givenAnswer.equals(question.getAnswer3()) && !(givenAnswer.equals(question.getCorrect())))
        {
            viewHolder.checkBoxScoreThree.setTextColor(context.getResources().getColor(R.color.red));
        }
        if (givenAnswer.equals(question.getAnswer3()) && (givenAnswer.equals(question.getCorrect())))
        {
            viewHolder.checkBoxScoreThree.setTextColor(context.getResources().getColor(R.color.holo_blue_dark));
        }

        if (givenAnswer.equals(question.getAnswer4()) && !(givenAnswer.equals(question.getCorrect())))
        {
            viewHolder.checkBoxScoreFour.setTextColor(context.getResources().getColor(R.color.red));
        }
        if (givenAnswer.equals(question.getAnswer4()) && (givenAnswer.equals(question.getCorrect())))
        {
            viewHolder.checkBoxScoreFour.setTextColor(context.getResources().getColor(R.color.holo_blue_dark));
        }

        // check all of the correct answers
        if (question.getAnswer1().equals(question.getCorrect()))
        {
            viewHolder.checkBoxScoreOne.setChecked(true);
        }
        if (question.getAnswer2().equals(question.getCorrect()))
        {
            viewHolder.checkBoxScoreTwo.setChecked(true);
        }
        if (question.getAnswer3().equals(question.getCorrect()))
        {
            viewHolder.checkBoxScoreThree.setChecked(true);
        }
        if (question.getAnswer4().equals(question.getCorrect()))
        {
            viewHolder.checkBoxScoreFour.setChecked(true);
        }

        return convertView;
    }
 convertView = theInflater.inflate(R.layout.score_layout, parent, false);

像这样初始化您的convertView。应该可以正常工作。

  1. Remove the final to the ViewHolder you do not need that. final删除到不需要的ViewHolder中。
  2. In the convertView == null add: convertView == null添加:

     convertView = theInflater.inflate(R.layout.score_layout, null); 

    It should be much better. 它应该好得多。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM