Android Comment savoir quelle case à cocher est sélectionnée
Je suis en train de faire ma première application Android et je vais avoir un problème pour lequel je ne trouve la réponse nulle part sur Google.
Je veux une liste d'articles avec des cases à cocher. Je veux à la fois l'élément lui-même et la case à cocher pour être cliquable.
public class MyItem extends ListActivity {
private ArrayList<MyItem> items;
public void onCreate(Bundle savedInstanceState) {
/* code which creates instances of MyItem and inserts them on the *list* variable */
MyArrayAdapter adapter = new MyArrayAdapter(this, R.layout.my_item, list);
setListAdapater(adapter);
setContentView(R.layout.items_list);
}
public onListItemClick(ListView l, View v, int position, long id){
//handles the click on an item
}
public class MyArrayAdapter extends ArrayAdapter<MyItem>{
private MyItem item;
public MyArrayAdapter(Context context, int resourceId, ArrayList<MyItem> list){
//code for the constructor
}
public getView(int position, View convertView, ViewGroup parent){
convertView = inflater.inflate(resourceId, null);
this.item = list.get(position);
if (this.item == null) {
return convertView;
}
else{
if (resourceId == R.layout.my_item) {
final CheckBox cb = (CheckBox)convertView.findViewById(R.id.checkbox);
if(cb != null){
//initially
if(chosen)
cb.setChecked(true);
else
cb.setChecked(false);
//set listener
cb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
if(cb.isChecked())
chosen = true;
else
chosen = false;
}
});
}
}
return convertView;
}
}
}
Ne vous inquiétez pas sur le choisi variable. J'ai écrit que de simplement le code. Il fait correspond à une valeur dans une base de données. La en cliquant sur un élément qui fonctionne très bien. Cependant lorsque je clique sur une case à cocher ce qui se passe est: est-ce
- la case dans laquelle j'ai cliqué apparaît sélectionnée (c'est le travail de l'Android UI)
- la case que l'interne est vérifié, c'est le dernier sur l'écran quoi qu'il en soit, c'est à dire, si j'ai mon écran affiche 8 éléments et que je clique dans l'un d'eux (n'importe laquelle) le contrôle apparaît dans la bonne case, mais en interne, le 8e élément est celui de se faire contrôler.
Je vous serais reconnaissant de toute aide que vous pourriez me fournir. Merci à l'avance.
OriginalL'auteur Inês | 2011-08-15
Vous devez vous connecter pour publier un commentaire.
En fait, la mise en œuvre de la sauvegarde
chosen
est la clé. Android n'certains d'optimisation avec les vues de liste pour vous permettre de réutiliser l'élément de la liste de vues pour éviter l'excès de création de l'objet et de collecte des ordures (qui est souvent source de défilement saccadé). En tant que tel, vous devez vous assurer que, le cas échéant, à vous de savoir exactement où l'élément de la liste que vous travaillez avec.Disons que vous avez une liste des 100 articles. Votre écran ne va probablement pas être en mesure d'afficher toutes les. Vous pouvez afficher uniquement les articles de dix à la fois. Donc 10 vues (vraiment vue des hiérarchies) sont créés pour afficher ces éléments visibles. Lorsque vous faites défiler vers le bas pour les dix prochaines éléments, au lieu de la création de 10 nouveaux points de vue (pour un total de 20), la liste peut seulement créer un plus (pour les cas où la moitié d'un élément est affiché en haut et la moitié de l'un est à l'affiche du bas de l'écran pour un total de 11 éléments visibles à l'écran) et le reste des éléments de la réutilisation des vues créées avant.
Donc conceptuels de la table représentant le premier écran devrait ressembler à ceci:
Et après le défilement de dix éléments, il peut paraître un peu comme ça (probablement pas exactement, mais cela vous donne l'idée):
De sorte que vous pouvez obtenir à partir de ce que d'une seule vue peut représenter les différents éléments que vous faites défiler. Cela signifie que vos gestionnaires d'événements doivent être un peu plus dynamique dans la façon de trouver l'article qu'elles sont liées à.
Tous c'est pour vous donner un peu de fond de sorte que vous pouvez changer la façon dont vous êtes à la mise en œuvre de votre
getView
méthode. Voici votre problème réel: la variableitem
est dans la portée de votreAdapter
. Malheureusement, je devine que votre code que vous n'avez pas posté ici que vous avez remplacé avecchosen
utiliseitem
. Vous définissezitem
chaque fois qu'un élément de la vue est créée. Cela signifie que, après ces 8 premières vues sont créées,item
est mis à la 8e élément à votre liste. Chaque fois que vous cliquez sur une case à cocher, vous êtes à l'aide deitem
qui est la 8ème élément, et non l'objet qui correspond à l'élément de liste de la vue que vous avez cliqué.Voici la structure de
getView
que je vous recommande:Noter que j'ai réussi à se débarrasser de la classe-niveau
item
variable.Mise à jour pour corriger le bug que vous l'avez souligné, juste au cas où quelqu'un d'autre se produit à travers le présent code.
OriginalL'auteur kabuko
Essayer cette
Pourquoi ne pas clickedItem.choisi = cb.isChecked()?
OriginalL'auteur Georgy Gobozov
Vous devez enregistrer isChecked valeur dans votre MyItem de l'objet et de l'ensemble explicite coché de case à cocher dans la méthode getView de votre adaptateur. Utilisation onCheckedChangedListener.
OriginalL'auteur Georgy Gobozov
Si je suis votre explication, il semble que vous avez une liste et chaque ligne de la liste a une Case à cocher et un TextView. Dans mon application j'ai quelque chose de similaire, et au lieu d'essayer de faire à la fois la Case à cocher et TextView cliquables et de réagir pour que j'utilise la liste de onItemclick. Quand vous prenez l'utilisateur a appuyé sur un élément dans la liste, puis dans le code, vous pouvez cocher ou décocher la Case. Il donne l'impression visuelle que l'utilisateur est en mesure de vérifier la boîte, mais il est super facile à mettre en œuvre.
OriginalL'auteur bursk