【问题标题】:Values of Spinner, Radio Button and check box duplicating when scrolling in RecyclerView在 RecyclerView 中滚动时 Spinner、Radio Button 和复选框的值重复
【发布时间】:2018-04-08 21:20:54
【问题描述】:

我有一个 RecyclerView,它有四种类型的视图

  1. 编辑文本
  2. 单选按钮
  3. 复选框
  4. 微调器

当我滚动填充了一些内容的 RecyclerView(例如选择单选按钮)时,该值也会在下一个视图中重复,因为我的视图再次重复。

我的适配器代码如下

练习测试适配器

    public class ExerciseTestAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private List<String> mList;
    private Context mContext;

    private final int FIRST_TYPE = 0;
    private final int SECOND_TYPE = 1;
    private final int THIRD_TYPE = 2;
    private final int FOURTH_TYPE = 3;

    public ExerciseTestAdapter(Context mContext) {
        mList = new ArrayList<>();
        this.mContext = mContext;    
    }

    public void addAllItems(List<String> items) {
        mList.addAll(items);
        notifyDataSetChanged();
    }

    public void deleteAll() {
        mList.clear();
        notifyDataSetChanged();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        RecyclerView.ViewHolder holder;
        View v;
        Context context = parent.getContext();


        switch (viewType) {
            case FIRST_TYPE:
                v = LayoutInflater.from(context).inflate(R.layout.item_question_text, parent, false);
                holder = new QuestionEditTextViewHolder(v);
                break;

            case SECOND_TYPE:
                v = LayoutInflater.from(context).inflate(R.layout.item_question_spinner, parent, false);
                holder = new QuestionSpinnerViewHolder(v);
                break;

            case THIRD_TYPE:
                v = LayoutInflater.from(context).inflate(R.layout.item_question_radio, parent, false);
                holder = new QuestionRadioViewHolder(v);
                break;

            case FOURTH_TYPE:
                v = LayoutInflater.from(context).inflate(R.layout.item_question_chk_box, parent, false);
                holder = new QuestionCheckBoxViewHolder(v);
                break;

            default:
                holder = null;
                break;
        }

        return holder;
    }


    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
        try {
            switch (holder.getItemViewType()) {
                case FIRST_TYPE:
                    QuestionEditTextViewHolder vh1 = (QuestionEditTextViewHolder) holder;
                    vh1.mQuestionNumber.setText(String.valueOf(position));

                    break;

                case SECOND_TYPE:
                    QuestionSpinnerViewHolder vh2 = (QuestionSpinnerViewHolder) holder;
                    vh2.mQuestionNumber.setText(String.valueOf(position));
                    break;

                case THIRD_TYPE:
                    QuestionRadioViewHolder vh3 = (QuestionRadioViewHolder) holder;
                    vh3.mQuestionNumber.setText(String.valueOf(position));

                    break;

                case FOURTH_TYPE:

                    QuestionCheckBoxViewHolder vh4 = (QuestionCheckBoxViewHolder) holder;
                    vh4.mQuestionNumber.setText(String.valueOf(position));

                    break;

                default:

                    break;
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public int getItemViewType(int position) {

        int SELECTED_TYPE;

        switch (mList.get(position)) {
            case "1":
                SELECTED_TYPE = FIRST_TYPE;
                break;

            case "2":
                SELECTED_TYPE = SECOND_TYPE;
                break;

            case "3":
                SELECTED_TYPE = THIRD_TYPE;
                break;

            case "4":
                SELECTED_TYPE = FOURTH_TYPE;
                break;

            default:
                SELECTED_TYPE = 100;
                break;

        }
        return SELECTED_TYPE;
    }

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

    private class QuestionEditTextViewHolder extends RecyclerView.ViewHolder {
        TextView mQuestionNumber;

        QuestionEditTextViewHolder(View v) {
            super(v);
            mQuestionNumber = v.findViewById(R.id.tv_question_num);
        }
    }

    private class QuestionSpinnerViewHolder extends RecyclerView.ViewHolder implements AdapterView.OnItemSelectedListener {

        private AppCompatSpinner mSpinnerAnswer;
        TextView mQuestionNumber;

        QuestionSpinnerViewHolder(View v) {
            super(v);

            String[] selectClass = {"Select", "YES", "NO", "OPTION 3", "OPTION 4"};
            mQuestionNumber = v.findViewById(R.id.tv_question_num);
            mSpinnerAnswer = v.findViewById(R.id.spinner_answer);

            ArrayAdapter classAdapter = new ArrayAdapter(mContext, android.R.layout.simple_spinner_item, selectClass);
            classAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            mSpinnerAnswer.setAdapter(classAdapter);

            mSpinnerAnswer.setOnItemSelectedListener(this);

        }

        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {

        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    }


    private class QuestionRadioViewHolder extends RecyclerView.ViewHolder {

        TextView mQuestionNumber;

        QuestionRadioViewHolder(View v) {
            super(v);
            mQuestionNumber = v.findViewById(R.id.tv_question_num);
        }
    }


    private class QuestionCheckBoxViewHolder extends RecyclerView.ViewHolder {

        TextView mQuestionNumber;

        QuestionCheckBoxViewHolder(View v) {
            super(v);

            mQuestionNumber = v.findViewById(R.id.tv_question_num);

        }
    }
}

我设置 RecycerView 的活动代码

 mExerciseRecycler = (RecyclerView) findViewById(R.id.exercise_recycler_view);

    ExerciseTestAdapter mTopicAdapter = new ExerciseTestAdapter(mContext);
    mExerciseRecycler.setLayoutManager(new LinearLayoutManager(mContext));
    mExerciseRecycler.setAdapter(mTopicAdapter);

    List<String> mLIst = new ArrayList<>();

   //Adding Dummy Data so that there can be many views in Recycler 
    mLIst.add("1");
    mLIst.add("2");
    mLIst.add("3");
    mLIst.add("4");

    mLIst.add("3");
    mLIst.add("4");
    mLIst.add("2");
    mLIst.add("1");

    mLIst.add("4");
    mLIst.add("3");
    mLIst.add("1");
    mLIst.add("2");

    mTopicAdapter.addAllItems(mLIst);

感谢任何帮助。 提前致谢

【问题讨论】:

    标签: android checkbox android-recyclerview radio-button spinner


    【解决方案1】:

    问题是回收站视图将重用视图。因此,请确保将所有数据(复选框、单选按钮、微调器的选择)存储到模型类并将这些值设置在 onBindViewHolder 中。

    创建一个具有所有视图属性的模型类,例如:

    public class ModelExample {
    private String questionNumber;
    private String isCheckBoxTicked;
    private String isRadioButtonSelected;
    private int spinnerPosition;
    
    public String getQuestionNumber() {
        return questionNumber;
    }
    
    public void setQuestionNumber(String questionNumber) {
        this.questionNumber = questionNumber;
    }
    
    public String getIsCheckBoxTicked() {
        return isCheckBoxTicked;
    }
    
    public void setIsCheckBoxTicked(String isCheckBoxTicked) {
        this.isCheckBoxTicked = isCheckBoxTicked;
    }
    
    public String getIsRadioButtonSelected() {
        return isRadioButtonSelected;
    }
    
    public void setIsRadioButtonSelected(String isRadioButtonSelected) {
        this.isRadioButtonSelected = isRadioButtonSelected;
    }
    
    public int getSpinnerPosition() {
        return spinnerPosition;
    }
    
    public void setSpinnerPosition(int spinnerPosition) {
        this.spinnerPosition = spinnerPosition;
    }
    }
    

    还创建 ModelExample 类型的数组列表以将数据传递给适配器 并在 onBindViewHolder 中设置所有值以从模型中查看

    case SECOND_TYPE:
                        QuestionSpinnerViewHolder vh2 = (QuestionSpinnerViewHolder) holder;
                        vh2.mSpinnerAnswer.setSelection(mList.getSpinnerPosition());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 2018-06-30
      • 2016-09-27
      • 2021-12-16
      相关资源
      最近更新 更多