具有多个布局项目的回收站视图在滚动条上重复了单选按钮

时间:2018-08-07 10:19:26

标签: android android-recyclerview

RecyclerView包含多种布局,例如包含Edittext的一行,radioButtons包含checkbox的另一行等

现在,当我输入第一个编辑文本并滚动列表时,相同的输入值将被复制到屏幕上可见的最后一个编辑文本中。

如果还有两个单选按钮可见,例如radio1和radio 2,那么在滚动时,这将变为 收音机1 radio2 收音机1 radio2 即radio1和radio 2在滚动上重复。

任何人都可以建议相同的解决方案吗?

  

动态编辑文本的代码

private void configureViewHolderText(final ViewHolderText holderText, final int position) {
    if (questionsArrayList != null && questionsArrayList.size() > 0) {

        String hint = questionsArrayList.get(position).getHelperText();
        int characterLength = questionsArrayList.get(position).getCharLimit();
        boolean isQuestionRequired = questionsArrayList.get(position).isRequired();


        if (isQuestionRequired) {
            holderText.getTv_dynamic_star().setVisibility(View.VISIBLE);
        }

        holderText.getTv_dynamic_text_view().setText(questionsArrayList.get(position).getQuestionText());

        if (characterLength > 0) {
            holderText.getEt_dynamic_edit_text().setFilters(new InputFilter[]{new InputFilter.LengthFilter(characterLength)});
        }


        if (hint != null && hint.equals("null") == false && hint.equals("") == false) {
            holderText.getEt_dynamic_edit_text().setHint(hint);
        } else {
            holderText.getEt_dynamic_edit_text().setHint("Enter Answer");
        }


        holderText.getEt_dynamic_edit_text().addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

                editTextInput = holderText.getEt_dynamic_edit_text().getText().toString();
              //  SubmitAnswerRequest submitAnswerRequest = new SubmitAnswerRequest();
              //  SubmitAnswerRequest.answers answers = submitAnswerRequest.new answers();

               // hashAnswerInput.put(questionsArrayList.get(position).get_id(), editTextInput);
                /*hashQuestionText.put(questionsArrayList.get(position).get_id(), questionsArrayList.get(position).getQuestionText()) ;
                hashQuestionId.put(questionsArrayList.get(position).get_id(), questionsArrayList.get(position).get_id()) ;
                hashAnswerType.put(questionsArrayList.get(position).get_id(), questionsArrayList.get(position).getAnswerType());*/

               /* for(Map.Entry map  :  hashAnswerInput.entrySet() )
                {
                    dynamicEditTextAnswer = String.valueOf(map.getValue());
                    //answers.setAnswerText(inputAnswer);
                }*/

                /*if(dynamicEditTextAnswer!= null)
                {*/
                    SubmitAnswerRequest submitAnswerRequest = new SubmitAnswerRequest();
                    SubmitAnswerRequest.answers answers = submitAnswerRequest.new answers();
                    answers.setQuestionText(questionsArrayList.get(position).getQuestionText());
                    answers.setQuestionId(questionsArrayList.get(position).get_id());
                    answers.setAnswerText(editTextInput);
                    answers.setAnswerType(questionsArrayList.get(position).getAnswerType());
                    answersArrayList.put(questionsArrayList.get(position).get_id(),answers);
              /*  }*/






                /*for(Map.Entry map  :  hashQuestionText.entrySet() )
                {
                    String inputAnswer = String.valueOf(map.getValue());
                    answers.setQuestionText(inputAnswer);
                }

                for(Map.Entry map  :  hashQuestionId.entrySet() )
                {
                    String inputAnswer = String.valueOf(map.getValue());
                    answers.setQuestionId(inputAnswer);
                }

                for(Map.Entry map  :  hashAnswerType.entrySet() )
                {
                    String inputAnswer = String.valueOf(map.getValue());
                    answers.setAnswerType(inputAnswer);
                }*/


               // SubmitAnswerRequest submitAnswerRequest = new SubmitAnswerRequest();
               // SubmitAnswerRequest.answers answers = submitAnswerRequest.new answers();
               // answers.setQuestionText(questionsArrayList.get(position).getQuestionText());
               // answers.setQuestionId(questionsArrayList.get(position).get_id());
               // answers.setAnswerText(editTextInput);
              //  answers.setAnswerType(questionsArrayList.get(position).getAnswerType());
              //  answersArrayList.add(answers);
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });



    }

}
  

动态单选按钮的代码

private void configureViewHolderRadioGroup(final ViewHolderRadioGroup holderRadioGroup, final int position) {
    if (questionsArrayList != null && questionsArrayList.size() > 0) {
        ArrayList<String> radioOptionsList = new ArrayList<String>();

        for (int j = 0; j < questionsArrayList.get(position).getOptions().size(); j++) {
            String radioItemName = questionsArrayList.get(position).getOptions().get(j).getOptionText();
            radioOptionsList.add(radioItemName);


        }

        holderRadioGroup.getTv_dynamic_text_view().setText(questionsArrayList.get(position).getQuestionText());

        boolean isQuestionRequired = questionsArrayList.get(position).isRequired();

        if (isQuestionRequired) {
            holderRadioGroup.getTv_dynamic_star().setVisibility(View.VISIBLE);
        }

        int totalCount = questionsArrayList.get(position).getOptions().size();
        final RadioButton[] rb = new RadioButton[totalCount];
        for (int i = 0; i < totalCount; i++) {
            rb[i] = new RadioButton(context);
            rb[i].setText(radioOptionsList.get(i));
            rb[i].setId(i);
            holderRadioGroup.getRg_dynamic_radio_group().addView(rb[i]); //the RadioButtons are added to the radioGroup instead of the layout


            holderRadioGroup.getRg_dynamic_radio_group().setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(RadioGroup group, int checkedId) {
                    for (int i = 0; i < group.getChildCount(); i++) {
                        RadioButton rg = (RadioButton) group.getChildAt(i);
                        if (rg.getId() == checkedId) {
                            radioInput = rg.getText().toString();


                            Toast.makeText(context, radioInput, Toast.LENGTH_SHORT).show();
                            SubmitAnswerRequest submitAnswerRequest = new SubmitAnswerRequest();
                            SubmitAnswerRequest.answers answers = submitAnswerRequest.new answers();
                            answers.setQuestionText(questionsArrayList.get(position).getQuestionText());
                            answers.setQuestionId(questionsArrayList.get(position).get_id());
                            answers.setAnswerText(radioInput);
                            answers.setAnswerType(questionsArrayList.get(position).getAnswerType());
                           // answersArrayList.add(answers);
                            answersArrayList.put(questionsArrayList.get(position).get_id(),answers);


                            ArrayList<String> relatedQuestionsId = new ArrayList<String>();
                            relatedQuestionsId = questionsArrayList.get(position).getOptions().get(i).getRelatedQuestionIds();

                            if (relatedQuestionsId != null && relatedQuestionsId.size() > 0) {

                                for (int k = 0; k < relatedQuestionsId.size(); k++) {
                                    ((LinearLayout) holderRadioGroup.getLl_parent_radio_child()).removeAllViews();
                                    getRadioChildQuestions(relatedQuestionsId, holderRadioGroup, k);
                                }

                            }


                            return;
                        }
                        else if(rg.getId() != checkedId) {
                            ArrayList<String> relatedQuestionsId = new ArrayList<String>();
                                /*for (int j = 0; j < questionsArrayList.get(position).getOptions().size(); j++) {*/
                            relatedQuestionsId = questionsArrayList.get(position).getOptions().get(i).getRelatedQuestionIds();

                            if (relatedQuestionsId != null && relatedQuestionsId.size() > 0) {

                                for (int k = 0; k < relatedQuestionsId.size(); k++) {

                                    ((LinearLayout) holderRadioGroup.getLl_parent_radio_child()).removeAllViews();
                                }

                            }
                        }
                    }
                }
            });


        }
    }


}

1 个答案:

答案 0 :(得分:2)

回收站视图重复使用您的视图持有者实例。 因此,如果您正在滚动并且某个布局将屏幕留在顶部,则当底部使用同一布局用于新项目时,它会被重用。

您需要重置onBindViewHolder方法中的所有动态属性。

为了更好地理解,在回收视图适配器中设置了两个调试点: 一种在onCreateViewHolder方法内部,另一种在onBindViewHolder方法内部。

编辑: 可以在这里找到有效的Recycler View适配器的示例:https://github.com/olLenz/Movies-with-Kotlin/blob/master/base/src/main/java/com/lenz/oliver/movieswithkotlin/ui/home/HomeAdapter.kt

onCreateViewHolder方法将创建ViewHolder的新实例。 onBindViewHolder方法仅在创建的ViewHolder实例上调用bind方法。此绑定方法在每次调用时将所有动态信息设置为给定的布局。