Обработка нескольких нажатий кнопок в Android Recyclerview и сохранение ответа в Array или ArrayList - PullRequest
0 голосов
/ 04 марта 2019

Я занимаюсь разработкой приложения для онлайн-викторины.Я разработал файл 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();
        }

    }

Данные в представлении Recycler отображаются из базы данных SQLite.

Теперь я хочу обработать / сохранить щелчки на нескольких кнопках и отправить их на удаленный сервер MySql.Я запутался, как хранить ответы на разные вопросы?Должен ли я использовать ArrayList или что-то еще, пожалуйста, помогите ......

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Было бы лучше, если бы вы создали вопрос с общим списком параметров, поэтому модель теста будет выглядеть так:

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

, а модель параметров будет выглядеть следующим образом:

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

После этого вы можете создать другое представление переработчика внутри каждого элемента вопроса и заполнить параметры, и каждый раз, когда пользователь нажимает на один из параметров, вы можете делегировать эти щелчки обратно в действие, чтобы обработать вопрос с новым ответом.

0 голосов
/ 05 марта 2019

В вашей модели DmQuiz добавьте поля questionId и selectedOption, которые помогут вам найти правильный ответ на вопрос, затем в 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 в качестве уникального идентификатора вопроса и answer в качестве выбора, то есть "a" / "b" / "c" / "d" и т. д., поэтому после того, как вам просто нужно пройти через этот List<DmQuiz> и создайте HashMap<String, String> (или эквивалент для поддержки пар (ключ = значение)) так же, как ("id" => "answer").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...