2017-10-27 19 views
0

에서 스크롤 할 때 나는 스피너 조회수스피너, 라디오 버튼의 값 및 상자의 복제를 확인 RecyclerView

  1. 글고
  2. 라디오 버튼
  3. CheckBox의
  4. 의 네 가지 유형을 가지고 RecyclerView이

    일부 내용이 채워진 (예 : 라디오 버튼 선택) RecyclerView를 스크롤하면 값이 duplica가됩니다. 내 견해가 다시 반복됨에 따라 다음 뷰에서도 마찬가지입니다. 내가 어떤 도움에 감사드립니다

    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); 
    

    내 RecycerView을 설정하고 위치를

    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); 
    
         } 
        } 
    } 
    

    내 활동 코드

    ExerciseTestAdapter

    아래

    내 어댑터 코드입니다. 미리 감사드립니다.

답변

0

리사이클 뷰는 뷰를 재사용합니다. 따라서 모든 데이터 (확인란, 라디오 버튼, 스피너 선택)를 모델 클래스에 저장하고 해당 값을 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의 ArrayList를이 은 어댑터에 데이터를 전달하고 onBindViewHolder에 모델에서 볼 수있는 모든 값을 설정

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