代码之家  ›  专栏  ›  技术社区  ›  Garrima Kakkr

具有多个布局项的回收器视图滚动上有重复的单选按钮

  •  0
  • Garrima Kakkr  · 技术社区  · 6 年前

    RecyclerView 包含多个布局,例如一行包含 Edittext , radioButtons 另一行包含 checkbox

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

    此外,如果有两个单选按钮显示radio1和Radio2,则在滚动时,此按钮变为 收音机1 无线电2 收音机1 无线电2 i、 e.收音机1和收音机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 回复  |  直到 6 年前
        1
  •  2
  •   Oliver    6 年前

    recycler视图重用视图持有者实例。 因此,如果您正在滚动,并且一个布局离开屏幕的顶部,它将被重用,而相同的布局应该用于底部的一个新项目。

    您需要重置 onBindViewHolder -方法。

    为了更好地理解,请在回收器视图适配器中设置两个调试点: 一个在里面 onCreateViewHolder -方法和一个在 onBindViewHolder -方法。

    编辑: 可在此处找到正在工作的回收器视图适配器的示例: 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方法。此绑定方法在每次调用时都将所有动态信息设置为给定的布局。