Selecting one RadioButton value and scrolling back removing the selected one in RecyclerView

后端 未结 9 1900
温柔的废话
温柔的废话 2020-12-15 18:24

In my application am displaying 20 multiple choice questions with the help of RecyclerView.

If I change the value of first RadioGroup and s

9条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-15 19:12

    I created a sample code that will work as per your req.

    First we have to create the xml as follows :

     
    
    
    
    

    Then we will create an interface as follows

    public interface OnOptionSelected {
    public void onOptionSelected(int position,int itemSelected);
    }
    

    Then we will create the model class as follows :

    public class QuestionModel {
    
    private String question;
    private int seleectedAnswerPosition;
    private boolean op1Sel,op2Sel,op3Sel; // options 
    
    public boolean isOp1Sel() {
        return op1Sel;
       }
    
    public void setOp1Sel(boolean op1Sel) {
        this.op1Sel = op1Sel;
        if(op1Sel){ // To make sure only one option is selected at a time
            setOp2Sel(false);
            setOp3Sel(false);
        }
       }
    
        public boolean isOp2Sel() {
          return op2Sel;
       }
    
       public void setOp2Sel(boolean op2Sel) {
        this.op2Sel = op2Sel;
        if(op2Sel){
            setOp1Sel(false);
            setOp3Sel(false);
         }
          }
    
     public boolean isOp3Sel() {
        return op3Sel;
         }
    
     public void setOp3Sel(boolean op3Sel) {
        this.op3Sel = op3Sel;
        if(op3Sel){
            setOp2Sel(false);
            setOp1Sel(false);
         }
        }
    
        public int getSeleectedAnswerPosition() {
        return seleectedAnswerPosition;
        }
    
      public void setSeleectedAnswerPosition(int seleectedAnswerPosition) {
        this.seleectedAnswerPosition = seleectedAnswerPosition;
       }
    
      public String getQuestion() {
        return question;
      }
     public void setQuestion(String question) {
        this.question = question;
      }
         } 
    

    Then we will create the view for row :

    
    
    
    
        
        
        
       
    

    Adapter class as follows:

     public class QuestionAdapter extends      RecyclerView.Adapter {
    
       private List questionModels;
    
    
    public void setOnOptionSelected(OnOptionSelected onOptionSelected) {
        this.onOptionSelected = onOptionSelected;
    }
    
    private OnOptionSelected onOptionSelected;
    
    
    public List getQuestionModels() {
        return questionModels;
    }
    
    public void setQuestionModels(List questionModels) {
        this.questionModels = questionModels;
    }
    
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView question;
        RadioGroup radioGroup;
        RadioButton op1, op2, op3;
    
        ViewHolder(View view) {
            super(view);
            question = (TextView) view.findViewById(R.id.question);
            //radioGroup=(RadioGroup)view.findViewById(R.id.radGroup);
            op1 = (RadioButton) view.findViewById(R.id.radoptionOne);
            op2 = (RadioButton) view.findViewById(R.id.radoptionTwo);
            op3 = (RadioButton) view.findViewById(R.id.radoptionThree);
            op1.setOnClickListener(this);
            op2.setOnClickListener(this);
            op3.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.radoptionOne:
                    onOptionSelected.onOptionSelected(getAdapterPosition(), 1);
                    break;
    
                case R.id.radoptionTwo:
                    onOptionSelected.onOptionSelected(getAdapterPosition(), 2);
                    break;
    
                case R.id.radoptionThree:
                    onOptionSelected.onOptionSelected(getAdapterPosition(), 3);
                    break;
            }
        }
    }
    
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v;
        // create a normal view
        v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.row_view, parent, false);
        return new ViewHolder(v);
    
    }
    
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, final int position) {
        viewHolder.question.setText(questionModels.get(position).getQuestion());
    
        Log.e("POSITION" + position, "1" + questionModels.get(position).isOp1Sel());
    
        Log.e("POSITION" + position, "2" + questionModels.get(position).isOp2Sel());
        Log.e("POSITION" + position, "3" + questionModels.get(position).isOp3Sel());
    
    
        viewHolder.op1.setChecked(questionModels.get(position).isOp1Sel());
        viewHolder.op2.setChecked(questionModels.get(position).isOp2Sel());
        viewHolder.op3.setChecked(questionModels.get(position).isOp3Sel());
    
    
    }
    
    @Override
    public int getItemCount() {
        if (questionModels != null) {
            return questionModels.size();
        }
        return 0;
    }
    }
    

    Then the Activity class :

    public class MainActivity extends Activity implements OnOptionSelected{
    
    private RecyclerView mRecyclerView;
    private List questionModels;
    private  QuestionAdapter questionAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRecyclerView =(RecyclerView)findViewById(R.id.recyclerViewAppList);
        mRecyclerView.setHasFixedSize(true);
        questionModels=new ArrayList();
        for (int i=0;i<20;i++)
        {
            QuestionModel questionModel=new QuestionModel();
            questionModel.setQuestion("Question " + (i + 1));
            questionModels.add(questionModel);
        }
        questionAdapter =new QuestionAdapter();
        questionAdapter.setOnOptionSelected(this);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        questionAdapter.setQuestionModels(questionModels);
        mRecyclerView.setLayoutManager(layoutManager);
        mRecyclerView.setAdapter(questionAdapter);
    }
    
    
    @Override
    public void onOptionSelected(int position, int itemSelected) {
        questionModels.get(position).setSeleectedAnswerPosition(itemSelected);
        switch (itemSelected){
            case 1:
                questionModels.get(position).setOp1Sel(true);
                break;
    
            case 2:
                questionModels.get(position).setOp2Sel(true);
                break;
            case 3:
                ((QuestionModel)questionModels.get(position)).setOp3Sel(true);
                break;
        }
        questionAdapter.setQuestionModels(questionModels);
        questionAdapter.notifyDataSetChanged();
       // mRecyclerView.setAdapter(questionAdapter);
    
    }
     }
    

    I tried the solution with Radiogroup but it was not working properly( sometime it was retaining the old value). Then I changed the way of the selecting options in my model class.

提交回复
热议问题