处理Android Recyclerview中的多个按钮单击并将响应存储在Array或ArrayList中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理Android Recyclerview中的多个按钮单击并将响应存储在Array或ArrayList中相关的知识,希望对你有一定的参考价值。

我正在设计在线测验App。我设计了PlayQuiz.java文件如下:

public class PlayQuiz extends AppCompatActivity {
    private RecyclerView recyclerView;
    DataBaseHelper database;
    private List<DmQuiz> quizList;
    private QuizAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_play_quiz);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        recyclerView=(RecyclerView)findViewById(R.id.recycler_view_quiz_display);
        database= new DataBaseHelper(PlayQuiz.this);
        quizList= database.fillObjQuesList();
        adapter=new QuizAdapter(quizList,getApplicationContext());
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(adapter);


        });
    }

}

现在,这是我的QuizAdapter.java文件

    public class QuizAdapter extends RecyclerView.Adapter<QuizAdapter.CustomViewHolder>{

        private List<DmQuiz>  questionList;
        private Context context;

        public QuizAdapter(List<DmQuiz> questionList, Context context) {
            this.questionList = questionList;
            this.context = context;
        }

        @NonNull
        @Override
        public CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View itemView= LayoutInflater.from(parent.getContext()).inflate(R.layout.quiz_display_format,parent,false);
            return new CustomViewHolder(itemView);
        }

        @Override
        public void onBindViewHolder(@NonNull final CustomViewHolder holder, final int position) {
            DmQuiz questionsList=questionList.get(position);

            holder.tvquestion.getLayoutParams().width= LinearLayout.LayoutParams.WRAP_CONTENT;
            holder.tvquestion.setText(questionsList.getQuestion());
            holder.optA.setText(questionsList.getOpta());
            holder.optB.setText(questionsList.getOptb());
            holder.optC.setText(questionsList.getOptc());
            holder.optD.setText(questionsList.getOptd());
            holder.optA.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    holder.optA.setBackgroundColor(context.getResources().getColor(R.color.colorButton));
                    holder.optA.setBackgroundResource(R.drawable.button_border);                 holder.optB.setBackgroundResource(R.drawable.button_border_unselected);     holder.optC.setBackgroundResource(R.drawable.button_border_unselected);                  holder.optD.setBackgroundResource(R.drawable.button_border_unselected);
                }
            });
holder.optB.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

             holder.optA.setBackgroundResource(R.drawable.button_border_unselected);
                    holder.optB.setBackgroundResource(R.drawable.button_border);
                    holder.optC.setBackgroundResource(R.drawable.button_border_unselected);
                    holder.optD.setBackgroundResource(R.drawable.button_border_unselected);



                }
            });
holder.optC.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    holder.optA.setBackgroundResource(R.drawable.button_border_unselected);
                    holder.optB.setBackgroundResource(R.drawable.button_border_unselected);
                    holder.optC.setBackgroundResource(R.drawable.button_border);
                    holder.optD.setBackgroundResource(R.drawable.button_border_unselected);

                }
            });
holder.optD.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    holder.optA.setBackgroundResource(R.drawable.button_border_unselected);
                    holder.optB.setBackgroundResource(R.drawable.button_border_unselected);
                    holder.optC.setBackgroundResource(R.drawable.button_border_unselected);
                    holder.optD.setBackgroundResource(R.drawable.button_border);

                }
            });
holder.tvClear.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    holder.optA.setBackgroundResource(R.drawable.button_border_unselected);
                    holder.optB.setBackgroundResource(R.drawable.button_border_unselected);
                    holder.optC.setBackgroundResource(R.drawable.button_border_unselected);
                    holder.optD.setBackgroundResource(R.drawable.button_border_unselected);

                }
            });

        }

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

        public class CustomViewHolder extends RecyclerView.ViewHolder{
            TextView tvquestion, tvClear;
            Button optA,optB,optC,optD;



            public CustomViewHolder(View itemView) {
                super(itemView);
                tvquestion=(TextView)itemView.findViewById(R.id.tvQuestion);
                optA=(Button)itemView.findViewById(R.id.button1);
                optB=(Button)itemView.findViewById(R.id.button2);
                optC=(Button)itemView.findViewById(R.id.button3);
                optD=(Button)itemView.findViewById(R.id.button4);
                tvClear=(TextView)itemView.findViewById(R.id.tvClear);


            }
        }
        public QuizAdapter(List<DmQuiz> questionList)
        {
            this.questionList=questionList;
        }
        public void setSearchOperation(List<DmQuiz> newList){
            questionList= new ArrayList<>();
            questionList.addAll(newList);
            notifyDataSetChanged();
        }

    }

Recyclerview中的数据正在从SQLite数据库中显示。

现在我想处理/存储多个按钮上的点击并将其发送到远程mysql服务器。我很困惑,如何存储不同问题的回复?我应该使用ArrayList或其他东西,请帮助......

答案

如果你用通用的选项列表创建一个问题会更好,所以测验模型会是这样的:

public class DmQuiz { 
    int id; 
    String question; 
    String answer; 
    int selectedOptionId;
    List<Options> options;
}

和期权模型将是:

public class Option { 
    int id; 
    String option;
    boolean isSelected;
 }

之后,您可以在每个问题项中创建另一个回收站视图并填充选项,每次用户单击其中一个选项时,您可以将这些点击委托回活动以使用新答案处理问题。

另一答案

在你的DmQuiz模型中添加一个questionIdselectedOption字段,可帮助您确定问题的正确答案,然后在onBindViewHolder()中针对所选选项设置单选按钮并使其他人不受控制。另外,将侦听器添加到单选按钮,将selectedOption设置为questionId。每当您想要将测验上传到服务器时,您可以根据远程服务器要求遍历列表来创建单独的列表。

请参考下面的DmQuiz模型..

class DmQuiz {
    //unique id per question
    int id;
    String question;
    String answer;
    String opta;
    String optb;
    String optc;
    String optd; 
}

在这里,你可以使用id作为一个独特的问题id和answer作为选择,即“a”/“b”/“c”/“d”等,所以在你只需要遍历这个List<DmQuiz>并创建一个HashMap<String, String> (或者等价于维持(key = value)对)(“id”=>“answer”)。

以上是关于处理Android Recyclerview中的多个按钮单击并将响应存储在Array或ArrayList中的主要内容,如果未能解决你的问题,请参考以下文章

android recyclerview的浅析。

Android RecyclerView 项目在滚动时随机播放

Android RecyclerView点击事件处理

Android 高性能列表:RecyclerView + DiffUtil

Android 高性能列表:RecyclerView + DiffUtil

Epoxy——RecyclerView的绝佳助手