首页 > 解决方案 > 计算每个 recyclerview 项目的 int 值,并在活动完成时加起来

问题描述

我正在制作一个多项选择应用程序,其中问题通过arraylist 显示在recyclerview 中。还有用于选择答案的按钮。并从 sqlite 获得正确的答案,并根据用户输入的答案执行 if 条件以计算每个问题的分数。像这样....

在此处输入图像描述

我的问题是当单击完成按钮(即在主要活动中)时,我不知道如何使用用户输入计算标记(单击按钮 bta1 true、bta1 false 等....)。我想计算每个问题的分数,每个问题总共5分。如果我点击完成按钮并且如果有 10 个问题并且所有用户输入的答案都是正确的,那么总分应该是 50 分。

这是我的 recyclerview 适配器类

public class Rvadapter extends RecyclerView.Adapter <Rvadapter.MyViewHolder> {

   private Context context;
   Activity activity;
    MyDatabaseHelper myDB;
    String questiontitle, question1, question2, question3, question4, question5, answer1, answer2, answer3, answer4, answer5;
    String answerdb1, answerdb2, answerdb3, answerdb4, answerdb5;
    Cursor cursor;
   ArrayList<ItemList> arlist;
   int marks, totalmark;
   private ArrayList arquestiontitle, arquestion1, arquestion2, arquestion3, arquestion4, arquestion5, aranswer1, aranswer2, aranswer3, aranswer4, aranswer5, armarks;
  String idtosee, orderid, orderdate, customername, customeraddress, customerphone, delifee, advance, tax, discount, itemname, itemcount, itemprice, mark;
    int a;
    Rvadapter(Activity activity, Context context, ArrayList arquestiontitle, ArrayList arquestion1, ArrayList arquestion2, ArrayList arquestion3, ArrayList arquestion4, ArrayList arquestion5, ArrayList aranswer1, ArrayList aranswer2, ArrayList aranswer3, ArrayList aranswer4, ArrayList aranswer5, ArrayList armarks){
        this.activity = activity;
        this.context = context;
       this.arquestiontitle = arquestiontitle;
       this.arquestion1 = arquestion1;
       this.arquestion2 = arquestion2;
       this.arquestion3 = arquestion3;
       this.arquestion4 = arquestion4;
       this.arquestion5 = arquestion5;
       this.aranswer1 = aranswer1;
       this.aranswer2 = aranswer2;
       this.aranswer3 = aranswer3;
       this.aranswer4 = aranswer4;
       this.aranswer5 = aranswer5;
       this.armarks = armarks;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);
      View view =   inflater.inflate(R.layout.cardlayoutquestion, parent, false);
        return new MyViewHolder(view);
    }
    
    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {

        holder.tvquestiontitle.setText(String.valueOf(arquestiontitle.get(position)));
        holder.tvquestion1.setText(String.valueOf(arquestion1.get(position)));
        holder.tvquestion2.setText(String.valueOf(arquestion2.get(position)));
        holder.tvquestion3.setText(String.valueOf(arquestion3.get(position)));
        holder.tvquestion4.setText(String.valueOf(arquestion4.get(position)));
        holder.tvquestion5.setText(String.valueOf(arquestion5.get(position)));
        holder.tvquestionid.setText(String.valueOf(position+1+". "));
        marks = Integer.parseInt(String.valueOf(armarks.get(position)));
        answerdb1 = String.valueOf(aranswer1.get(position));
        answerdb2 = String.valueOf(aranswer2.get(position));
        answerdb3 = String.valueOf(aranswer3.get(position));
        answerdb4 = String.valueOf(aranswer4.get(position));
        answerdb5 = String.valueOf(aranswer5.get(position));


        holder.bta1true.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(answer1 == null){
                    answer1 = "T";
                    holder.bta1true.setBackgroundResource(R.drawable.selected120);
                    holder.bta1false.setBackgroundResource(R.drawable.unselected120);
                }else if ( answer1.equals("F")){
                    answer1 = "T";
                    holder.bta1true.setBackgroundResource(R.drawable.selected120);
                    holder.bta1false.setBackgroundResource(R.drawable.unselected120);
                }else {
                    answer1 = null;
                    holder.bta1true.setBackgroundResource(R.drawable.unselected120);
                }
            }
        });
        
        holder.bta1false.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(answer1 == null){
                    answer1 = "F";
                    holder.bta1false.setBackgroundResource(R.drawable.selected120);
                    holder.bta1true.setBackgroundResource(R.drawable.unselected120);
                }else if ( answer1.equals("T")){
                    answer1 = "F";
                    holder.bta1true.setBackgroundResource(R.drawable.unselected120);
                    holder.bta1false.setBackgroundResource(R.drawable.selected120);
                }else {
                    answer1 = null;
                    holder.bta1false.setBackgroundResource(R.drawable.unselected120);
                }
            }
        });

    }

    private void checkmarks() {
        if(answer1!=null){
            if(answer1.equals(answerdb1)){
                marks++;
            }else {
                marks--;
            }
        }

        if(answer2!=null){
            if(answer2.equals(answerdb2)){
                marks++;
            }else{
                marks--;
            }
        }

        if(answer3!=null){
            if(answer3.equals(answerdb3)){
                marks++;
            }else{
                marks--;
            }
        }

        if(answer4!=null){
            if(answer4.equals(answerdb4)){
                marks++;
            }else{
                marks--;
            }
        }

        if(answer5!=null){
            if(answer5.equals(answerdb5)){
                marks++;
            }else{
                marks--;
            }
        }

        if(marks<0){
            marks=0;
        }

    }


    @Override
    public int getItemCount() {
        return arquestiontitle.size();
    }

    public static class MyViewHolder extends RecyclerView.ViewHolder {
        TextView tvquestiontitle, tvquestion1, tvquestion2, tvquestion3, tvquestion4, tvquestion5, tvquestionid, tvmarks;
        Button bta1true, bta1false, bta2true, bta2false, bta3true, bta3false, bta4true, bta4false, bta5true, bta5false;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            tvquestiontitle = itemView.findViewById(R.id.tvquestiontitle);
            tvquestion1 = itemView.findViewById(R.id.tvquestion1);
            tvquestion2 = itemView.findViewById(R.id.tvquestion2);
            tvquestion3 = itemView.findViewById(R.id.tvquestion3);
            tvquestion4 = itemView.findViewById(R.id.tvquestion4);
            tvquestion5 = itemView.findViewById(R.id.tvquestion5);
            tvquestionid = itemView.findViewById(R.id.tvquestionid);
            tvmarks = itemView.findViewById(R.id.tvmarks);
            bta1true = itemView.findViewById(R.id.bta1true);
            bta1false = itemView.findViewById(R.id.bta1false);
            bta2true = itemView.findViewById(R.id.bta2true);
            bta2false = itemView.findViewById(R.id.bta2false);
            bta3true = itemView.findViewById(R.id.bta3true);
            bta3false = itemView.findViewById(R.id.bta3false);
            bta4true = itemView.findViewById(R.id.bta4true);
            bta4false = itemView.findViewById(R.id.bta4false);
            bta5true = itemView.findViewById(R.id.bta5true);
            bta5false = itemView.findViewById(R.id.bta5false);
        }
    }
}

请帮助我...如何计算每个问题的分数(回收卡视图项目)并将所有这些汇总在一起。我可以通过下一个按钮一次只用一个问题来获得它们,但这次我想展示recyclerview中的所有问题..

标签: javasqliteandroid-studioandroid-recyclerview

解决方案


改用复选框

首先。如果用户输入(在这种情况下为答案)是布尔类型,那么您应该使用复选框而不是按钮(更容易处理)。
布局看起来像这样:

如果你愿意,你可以坚持使用按钮

创建一个类来存储答案

然后创建一个类来存储答案(让我们称之为“答案”)
public class Answer {

    private int questionNumber;//number of the question
    private Boolean bta1, bta2, bta3, bta4, bta5;//answers
    public Answer() {
    }

    public Answer(int questionNumber, Boolean bta1, Boolean bta2, Boolean bta3, Boolean bta4, Boolean bta5) {
        this.questionNumber = questionNumber;
        this.bta1 = bta1;
        this.bta2 = bta2;
        this.bta3 = bta3;
        this.bta4 = bta4;
        this.bta5 = bta5;
    }

    public int getQuestionNumber() {
        return questionNumber;
    }

    public void setQuestionNumber(int questionNumber) {
        this.questionNumber = questionNumber;
    }

    public Boolean getBta1() {
        return bta1;
    }

    public void setBta1(Boolean bta1) {
        this.bta1 = bta1;
    }

    public Boolean getBta2() {
        return bta2;
    }

    public void setBta2(Boolean bta2) {
        this.bta2 = bta2;
    }

    public Boolean getBta3() {
        return bta3;
    }

    public void setBta3(Boolean bta3) {
        this.bta3 = bta3;
    }

    public Boolean getBta4() {
        return bta4;
    }

    public void setBta4(Boolean bta4) {
        this.bta4 = bta4;
    }

    public Boolean getBta5() {
        return bta5;
    }

    public void setBta5(Boolean bta5) {
        this.bta5 = bta5;
    }

}

为每个问题创建一个对象

并为 MainActivity 中的每个问题创建对象
public class MainActivity extends AppCompatActivity {


    ArrayList<Answer> answers = new ArrayList<>();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initializeAnswers();
        .
        .
        .
    }
    
    // here we create object for each question and make it default value all false
    public void initializeAnswers(){
        for (int i=1;i<=20;i++){//replace 20 with how many questions you have
            answers.add(new Answer(i,false,false,false,false,false));
        }
    }
    // this is the methode that will be called when the user press a checkbox(change its value)
    public void setQuestionResult(int questionNumber, int optionNumber, boolean value){
        switch (optionNumber){
            case 1:
                answers.get(questionNumber+1).setBta1(value);
                break;
            case 2:
                answers.get(questionNumber+1).setBta2(value);
                break;
            case 3:
                answers.get(questionNumber+1).setBta3(value);
                break;
            case 4:
                answers.get(questionNumber+1).setBta4(value);
                break;
            case 5:
                answers.get(questionNumber+1).setBta5(value);
                break;
        }
    }
    
}

捕捉用户输入

之后,我们将为 recyclerview 项目中的每个按钮(或复选框)设置点击侦听器,因此当用户选择答案时,我们将其存储在我们之前创建的对象中。我们将在 `ViewHolder` 中执行此操作
class MyViewHolder extends RecyclerView.ViewHolder {
    int questionNumber;
    TextView tvquestiontitle, tvquestion1, tvquestion2, tvquestion3, tvquestion4, tvquestion5, tvquestionid, tvmarks;
    CheckBox bta1, bta2, bta3, bta4, bta5;
    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
        tvquestiontitle = itemView.findViewById(R.id.tvquestiontitle);
        tvquestion1 = itemView.findViewById(R.id.tvquestion1);
        tvquestion2 = itemView.findViewById(R.id.tvquestion2);
        tvquestion3 = itemView.findViewById(R.id.tvquestion3);
        tvquestion4 = itemView.findViewById(R.id.tvquestion4);
        tvquestion5 = itemView.findViewById(R.id.tvquestion5);
        tvquestionid = itemView.findViewById(R.id.tvquestionid);
        tvmarks = itemView.findViewById(R.id.tvmarks);
        bta1 = itemView.findViewById(R.id.bta1);
        bta2 = itemView.findViewById(R.id.bta2);
        bta3 = itemView.findViewById(R.id.bta3);
        bta4 = itemView.findViewById(R.id.bta4);
        bta5 = itemView.findViewById(R.id.bta5);
        View.OnClickListener onClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Is the view now checked?
                boolean checked = ((CheckBox) v).isChecked();
                int optionNumber;// e.g "1 is A" "2 is B" etc..
                //get option number form the view id
                switch (v.getId()) {
                    case R.id.bta1:
                        optionNumber = 1;
                        break;
                    case R.id.bta2:
                        optionNumber = 2;
                        break;
                    case R.id.bta3:
                        optionNumber = 3;
                        break;
                    case R.id.bta4:
                        optionNumber = 4;
                        break;
                    case R.id.bta5:
                        optionNumber = 5;
                        break;
                    default:
                        optionNumber = 0;
                }
                // here we will pass the changes to setQuestionResult to the Activity to process it
                ((MainActivity)context).setQuestionResult(questionNumber,optionNumber,checked);
            }
        };
        bta1.setOnClickListener(onClickListener);
        bta2.setOnClickListener(onClickListener);
        bta3.setOnClickListener(onClickListener);
        bta4.setOnClickListener(onClickListener);
        bta5.setOnClickListener(onClickListener);
    }
}

您可能会意识到我在顶部 ( int questionNumber;) 中添加了一个参数,这将确定我们正在处理的问题。
您还需要在 中为此参数设置一个值onBindViewHolder

@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
    holder.questionNumber = position+1;//add one because the position of the first item is 0
    .
    .
    .
}

计算每个问题的分数

最后。当你想计算一个问题的分数时,结果会被存储起来answers,只需调用它即可

answers.get(questioNumber+1)//add one because the index always start from 0

最后一件事。在 recyclerview 中更改项目状态时可能会遇到问题,因此当您向下滚动第一个项目时,第一个项目变得不可见并且 recyclerview回收这些项目,因此发生的任何更改(例如选中复选框)都将丢失,并且项目将重置为第一个状态。
如果发生这种情况,请检查此解决方案

更新

正如我之前提到的,如果需要,您仍然可以使用按钮或任何您觉得更好
的输入类型来完成。您唯一需要更改的是捕获用户输入的方式。
例如,如果您使用按钮,您将有 3 个可能的输入:
  1. 真的。如果按下 btn1 而未按下 btn2
  2. 错误的。如果 bot 中的 btn1 被按下 bur btn2 被按下
  3. 两者都不。如果没有按下 btn1 和 btn2

您可以使用布尔类型来存储输入,null方法是当值既不为真也不为假(例如bta1=null

这种方法的问题在于它非常复杂和令人困惑(但仍然可能)
所以。我的建议是使用 3 个雕像复选框。
这是一个第三方库女巫,您可以将其添加到您的项目中。
它几乎是一个包含三个统计信息的复选框

  1. 已检查
  2. 未选中
  3. 不定

你可以在这里找到它GitHub
另一个在这里GitHub


推荐阅读