2017-09-29 9 views
0

Il y a des réponses à ces questions mais aucune d'entre elles n'a résolu mon problème. Voici mon code.Comment sélectionner une seule case à cocher dans une vue recycleur avec plusieurs cases à cocher

public class QuizAdapter extends RecyclerView.Adapter<QuizAdapter.MyViewHolder> { 
Context context; 
private List<Quiz_G_S> quiz_g_sList = null; 
int selectedPosition = -1; 


public QuizAdapter(Context context, List<Quiz_G_S> list) { 
    this.context = context; 
    this.quiz_g_sList = list; 
} 


@Override 
public QuizAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.quiz_single_row, parent, false); 

    return new MyViewHolder(itemView); 

} 

@Override 
public void onBindViewHolder(final QuizAdapter.MyViewHolder holder, int position) { 

    final int pos = position; 

    holder.answers.setText(quiz_g_sList.get(pos).getMCQ()); 

    holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

      quiz_g_sList.get(pos).setChecked(true); 

     } 
    }); 

    if (quiz_g_sList.get(pos).isChecked()) { 
     holder.checkBox.setChecked(true); 
     notifyDataSetChanged(); 

    } else { 
     holder.checkBox.setChecked(false); 

    } 





} 


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

public class MyViewHolder extends RecyclerView.ViewHolder { 

    TextView answers; 
    CheckBox checkBox; 

    public MyViewHolder(View v) { 
     super(v); 

     answers = (TextView) v.findViewById(R.id.quiz_adap_ans); 
     checkBox = (CheckBox) v.findViewById(R.id.quiz_adap_check); 

    } 
} 

Ci-dessus est mon code adaptateur.

Ceci est ma Quiz_G_S classe

public class Quiz_G_S { 


String MCQ; 
int Rank; 
boolean checked; 

public boolean isChecked() { 
    return checked; 
} 

public void setChecked(boolean checked) { 
    this.checked = checked; 
} 

public String getMCQ() { 
    return MCQ; 
} 

public void setMCQ(String mcq) { 
    this.MCQ = mcq; 
} 

public int getRank() { 
    return Rank; 
} 

public void setRank(int rank) { 
    this.Rank = rank; 
} 

}

Ce que je veux faire est de savoir si je vérifie une case à cocher, puis toutes les cases tournerai sans contrôle, sauf celui que je vérifié Il y a une erreur sur notifyDataSetChanged . Je suppose que la logique est juste, mais je ne sais pas comment rafraîchir case à cocher state.The seule chose que je sais est notifyDataSetChanged est-il une autre méthode pour rafraîchir ou est-il une solution à ce problème

Répondre

0

Au lieu de

selectedPosition = holder.getAdapterPosition(); 

maintenir un drapeau dans votre classe d'objet qui sera défini sur contrôle de la case à cocher particulière suppose « cochée » est votre drapeau que vous avez créé dans votre classe d'objets puis

sur l'auditeur contrôle du changement mis à true

if (isChecked) { 
    holder.checkBox.setChecked(true); 

} else { 
    holder.checkBox.setChecked(false); 

} 

EDIT

if (quiz_g_sList.get(pos).isChecked) { 
     holder.checkBox.setChecked(true); 

    } else { 
     holder.checkBox.setChecked(false); 

    } 

MISE À JOUR

changer votre classe d'objets à ce

public class Quiz_G_S { 

     String MCQ; 
     int Rank; 
     boolean checked; 

     public boolean isChecked() { 
      return checked; 
     } 

     public void setChecked(boolean checked) { 
      this.checked = checked; 
     } 

     public String getMCQ() { 
      return MCQ; 
     } 

     public void setMCQ(String mcq) { 
      this.MCQ = mcq; 
     } 

     public int getRank() { 
      return Rank; 
     } 

     public void setRank(int rank) { 
      this.Rank = rank; 
     } 
    } 
+0

mais comment vais-je rafraîchir l'état des cases à cocher? –

+0

S'il vous plaît voir mon édition – YoLo

+0

ce qui est setChecked (true) dans quiz_g_sList.get (pos) .setChecked (true) ;. Est-ce une méthode que je dois créer? –

0

J'ai mis en place comme ça, où je suis sortie.

if(view == null) { 

     view = inflater.inflate(R.layout.todo_checkbox_adapter_layout, parent, false); 
     holder = new ViewHolder(); 
     holder.todoItemTextView = (TextView) view.findViewById(R.id.item_tv); 
     holder.checkedTextView = (CheckBox) view.findViewById(R.id._item_checkbox); 
     view.setTag(holder); 
    } else { 
     holder = (ViewHolder) view.getTag(); 
    } 
    holder.todoItemTextView.setTag("" + position); 
    holder.checkedTextView.setChecked(displayModel.isFinished()); 

    holder.checkedTextView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 
      try { 
       String tag = (String) holder.todoItemTextView.getTag(); 
       int pos = Integer.parseInt(tag); 
       todoItemBeanList.get(pos).setFinished(isChecked); 
      } catch (NumberFormatException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
0

Qu'est-ce que vous avez à faire:

  1. passe vérifié la position à l'activité/Fragment/Présentateur (Mettre en œuvre un clic/auditeur checkChanged). Des exemples peuvent être trouvés ici: RecyclerView onClick
  2. Enregistrer la position de l'élément vérifié dans une variable (par exemple int selectedPosition).
  3. puis mettre à jour l'article précédemment vérifié sur chaque clic/vérifier:

if (position != selectedPosition) { // user selected another item so previous one should be updated adapter.notifyItemChanged(selectedPosition); selectedPosition = position; }

0

essayer ci-dessous le code:

  1. Définir un objet de plus dans votre Quiz_G_S classe boolean isChecked

  2. Obtenez la position de vérifié CheckBox

    selectedPosition = holder.getAdapterPosition();

  3. Réinitialiser tous les autres objets de la liste comme ci-dessous:

    for (int i=0; i<list.size ; i++) 
    { 
        if (selectedPosition==i) 
        list.get(i).setIsChecked(true); 
        else  
        list.get(i).setIsChecked(false); 
    } 
    
  4. appel QuizAdapter.this.notifyDataSetChanged();.

  5. En dernier, cochez la case à cocher sélectionnée comme ci-dessous:

    if (list.get(position).getIsChecked()) 
    { 
        holder.checkBox.setChecked(true); 
    } else { 
        holder.checkBox.setChecked(false); 
    }