Case à cocher de l'appel automatique onCheckedChange quand listview de défilement?
J'ai un problème avec listview qui élément de la liste contient une case à cocher. Quand je coche une case et faites défiler la liste, case à cocher, parfois, l'appel automatique oncheckedchange et la valeur de la case est changé!
Ou, lorsque ma liste a plus de 9 ou 10 de l'élément, puis quand j'ai vérifié à l'article 1, point 8 ou 9 est-elle vérifiée???
Quelqu'un peut me dire ce que dois-je corriger ce bug?
Merci d'avance!
list_item.xml
<ImageView
android:layout_alignParentLeft="true"
android:layout_width="36dip"
android:layout_height="36dip"
android:layout_centerVertical="true"
android:scaleType="fitCenter"
android:id="@+id/image_view"
android:src="@drawable/icon" />
<TextView android:layout_toRightOf="@id/image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="5dip"
android:id="@+id/text_view"
android:lines="1"
android:textSize="20sp"
android:textColor="@color/white" />
<TextView android:layout_toRightOf="@id/image_view"
android:layout_below="@id/text_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="5dip"
android:id="@+id/text_view2"
android:textSize="14sp"
android:lines="1"
android:textColor="@color/white" />
et voici l'adaptateur d'affichage:
public View getView(int position, View convertView, ViewGroup parent) {
Log.e(TAG, "getView");
ViewHolder mViewHolder;
if (convertView == null) {
Log.e(TAG, "Inflater is inflating...");
convertView = mInflater.inflate(R.layout.custom_list_app, null);
mViewHolder = new ViewHolder();
mViewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.checkbox);
mViewHolder.remove = convertView.findViewById(R.id.music_info);
convertView.setTag(mViewHolder);
} else {
mViewHolder = (ViewHolder) convertView.getTag();
Log.e(TAG, "Position: " + position + " CheckBox: " + mViewHolder.checkbox.isChecked());
}
mViewHolder.checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton cb, boolean flag) {
//TODO Auto-generated method stub
if (flag) {
Log.d(TAG, "Checkbox checked");
} else {
Log.d(TAG, "Checkbox un-checked");
}
}
});
return convertView;
}
InformationsquelleAutor khaintt | 2011-05-23
Vous devez vous connecter pour publier un commentaire.
La
ListView
recycle les classes de vue: vous devez définir explicitement ou non la Case est cochée dans lagetView
classe. Afin d'ajouter une case commeavant d'appeler
setOnCheckedChangeListener
.setOnCheckedChangeListener
, mais vous devez utiliser leposition
argumentgetView
pour dire si oui ou non la case doit être cochée et le changer de manière appropriée CHAQUE FOISgetView
est appelé.setChecked(true)
ousetChecked(false)
CHAQUE foisgetView
est appelé si vous écrasezgetView
.Dans la liste, l'élément ont un attribut pour définir si l'élément est coché ou non. Vous pouvez utiliser ce paramètre vous point de savoir si coché, et d'abord, vous devez définir la
Puis régler l'
new OnCheckedChangeListener()
J'espère que ma réponse est utile pour vous et ceux qui vous regardent cette page ou ont de la difficulté à composer avec les listviews qui ont de l'élément de cases à cocher.
Je ne suis pas sûr si ce est un moyen sympa. Mais le code ci-dessous résolu mon problème. Même dans le code ci-dessous, la setOnCheckChangeListener() a été appelé (lire faussement déclenché) sur le défilement de la liste. La tâche est de maintenir une liste des éléments qui ont été sélectionnés par l'utilisateur. Alors, quand il y a un déclencheur, j'ai d'abord consulter ma liste et ne fait qu'ajouter un élément, si ce n'était pas déjà présent dans la liste, sinon j'ignore la fonction de rappel.
La plupart de ces sont trop impliqués (mais ils font un travail). Tous les que vous essayez de faire est d'arrêter l' .setChecked déclenchement de l'événement si la vue est en cours de chargement et fixant le statut vérifié. Alors, ensemble d'une classe locale variable isLoading, attribuez la valeur true au début de getView et affectez la valeur false à la fin de getView. Puis dans l'écouteur de clics, consultez isLoading
La OnClickListener est travaillé pour moi avec le même problème et je peut envoyer des données à une autre activité
titulaire.cks.setOnClickListener(new View.OnClickListener() {