ListView : ajout dynamique de row contenant des radiobutton
Bonjour tout l'monde !
Je viens parmis vous avec le probleme suivant, j'essaie de créer une frame depuis laquelle on peut ajouter à l'aide d'un bouton de nouvelles vues contenant un radiogroup composé de plusieurs radiobuttons..
Le soucis est qu'avec mon code, je me retrouve avec des comportement non désirés, par exemple :
Lorsque j'ajoute plusieurs row, si la premiere je coche un des rabiobuttons, que je scrool en bas et qu'ensuite je scroll en haut de mon écran pour allez revoir ma premiere row...Mon radionbutton est décoché (donc soucis de recyclage de vue, alors que j'ai forcé la sauvegarde des données dans mon code)
Et lorsque je coche un radiobutton et que j'ajoute de novuelles rows via le boutton dont j'ai parlé plus hat, à ce moment là certains radiobutton se cochent automatiquement.
Voici mon code, pourriez vous me dire où se trouve mon erreur ?
Un bout de mon frame :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
final ViewGroup root = (ViewGroup) inflater.inflate(
R.layout.slide_cavite, null);
listview_cavite = (ListView) root.findViewById(R.id.listview_cavite);
// Arbre.table_cavite.open();
adaptor = new Adaptor_cavite_item(root.getContext(),
R.layout.slide_item_cavite, Arbre.liste_cavite);
listview_cavite.setAdapter(adaptor);
ajouter_cavite = (Button) root.findViewById(R.id.ajouter_cavite);
ajouter_cavite.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//Arbre.liste_cavite.add(new Donnees_cavite());
adaptor.add(new Donnees_cavite(root.getContext()));
adaptor.notifyDataSetChanged();
}
}); |
Les données de l'objet représenté dans une row :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
public class Donnees_cavite {
int rb_excrement_checked;
public int get_rb_excrement_checked() {
return rb_excrement_checked;
}
public void setFirstChecked(int firstChecked) {
this.rb_excrement_checked = firstChecked;
}
public Donnees_cavite(Context context){
this.rb_excrement_checked = -1;
}
} |
et enfin mon arrayadapter perso :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
public class Adaptor_cavite_item extends ArrayAdapter<Donnees_cavite> {
int layoutResourceId;
Holder holder;
ArrayList<Donnees_cavite> liste;
private LayoutInflater mInflater;
...
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View row = convertView;
if (row == null) {
row = mInflater.inflate(R.layout.slide_item_cavite, null);
holder = new Holder();
holder.excrement = (RadioGroup) row.findViewById(R.id.slide_cavite_excrement);
holder.excrement_1 = (RadioButton) row.findViewById(R.id.slide_cavite_excrement_rb1);
holder.excrement_2 = (RadioButton) row.findViewById(R.id.slide_cavite_excrement_rb2);
row.setTag(this.holder);
}else{
this.holder = (Holder) row.getTag();
}
holder.excrement.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup arg0, int arg1) {
// TODO Auto-generated method stub
switch (arg1) {
case R.id.slide_cavite_excrement_rb1:
liste.get(position).setFirstChecked(1);
break;
case R.id.slide_cavite_excrement_rb2:
liste.get(position).setFirstChecked(2);
break;
}
}
});
if (liste.get(position).get_rb_excrement_checked() == 1){
holder.excrement_1.setChecked(true);
holder.excrement_2.setChecked(false);
}else if (liste.get(position).get_rb_excrement_checked() == 2){
holder.excrement_1.setChecked(false);
holder.excrement_2.setChecked(true);
}else{
holder.excrement_1.setChecked(false);
holder.excrement_2.setChecked(false);
}
return row;
}
static class Holder {
RadioGroup excrement;
RadioButton excrement_1,excrement_2;
}
}
} |
Le pire, c'est que si je remplace ce bout de code à la fin de mon arrayadapter :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
if (liste.get(position).get_rb_excrement_checked() == 1){
holder.excrement_1.setChecked(true);
holder.excrement_2.setChecked(false);
}else if (liste.get(position).get_rb_excrement_checked() == 2){
holder.excrement_1.setChecked(false);
holder.excrement_2.setChecked(true);
}else{
holder.excrement_1.setChecked(false);
holder.excrement_2.setChecked(false);
} |
par
Code:
1 2 3 4 5 6 7 8
|
if (liste.get(position).get_rb_excrement_checked() == 1){
holder.excrement_1.setChecked(true);
holder.excrement_2.setChecked(false);
}else{
holder.excrement_1.setChecked(false);
holder.excrement_2.setChecked(true);
} |
Plus aucun comportement non désirable ! tout fonctionne nickel.. Déjà, je ne comprend pas pourquoi le code initial provoque mes "bugs" ^^ et ensuite, bah ce code marche..mais ça m'arrange pas car je dois avoir plusieurs radiobutton (>2) par row ^^
Merci pour votre aide !