2013-04-29 1 views
2

Mon application a un questionnaire qui est affiché grâce à un listView. L'utilisateur peut répondre par true ou false en cliquant sur le ListItem. Un imageView indique que la réponse est vraie. (Je change l'imageView chaque fois que l'on clique sur ListItem)Android: Pourquoi setImageResource modifie plusieurs images dans mon listView/onListItemClick?

Globalement cela fonctionne très bien. J'ai été capable de changer l'imageView dynamiquement mais de façon surprenante quand j'utilise setImageResource, l'image change sur plusieurs lignes. Pour l'istance, si je clique sur la ligne 2 (index 1), l'image change sur la ligne 2 mais aussi sur les lignes 12 et 22.

Pour l'instant, je n'ai pas trouvé la solution. Je vous serais reconnaissant si vous avez la moindre idée pour moi.

Voici la mise en page de mon listitem

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="30dp" 
> 

<ImageView 
    android:id="@+id/ivCheck" 
    android:layout_width="25dp" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical" 
    android:contentDescription="selection state" 
    android:src="@drawable/check_grey" /> 


<TextView 
android:id="@+id/tvId" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:textIsSelectable="false" 
android:layout_gravity="center_vertical" 
android:text="dummy text" 
android:visibility="gone" 
/> 

<TextView 
    android:id="@+id/tvText" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_gravity="center_vertical" 
    android:layout_marginLeft="14dp" 
    android:layout_toRightOf="@+id/ivCheck" 
    android:text="dummy text" 
    android:textIsSelectable="false" /> 

</RelativeLayout> 

Voici ma méthode de changer l'image (dans un ListActivity)

protected void onListItemClick(ListView l, View v, int position, long id) {  
ImageView image = (ImageView)v.findViewById(R.id.ivCheck); 
QuizAnswer currentQuizAnswer = (QuizAnswer) quizRequest.getListAnswers().get(position); 
if(currentQuizAnswer.isSelected()) { 
    image.setImageResource(R.drawable.check_grey); 
} else { 
    image.setImageResource(R.drawable.check_green); 
} 
currentQuizAnswer.setSelected(!currentQuizAnswer.isSelected()); 
} 

Nous vous remercions d'avance pour votre aide

+0

Votre liste est-elle affichée correctement? Par hasard avez-vous ces éléments répétés? Probablement, ils sont la même vue, c'est pourquoi il agit comme ça. –

Répondre

0

Il est en raison du recyclage des vues dans ListView. Vous devez surchargergetView méthode de votre adaptateur et réinitialiser la source pour vos ImageViews qui ne se rapporte pas à la modification précédente. Pour plus d'informations, lire this ou regarder this vidéo.

+0

Le comportement n'était pas facile à comprendre. Merci pour ces liens utiles. – ddams

+0

Oui, c'est un sujet difficile au début mais une fois que vous commencez à travailler dessus, vous le trouverez facile – waqaslam

0

changement de ligne unique et voir la magie

position = position % (QuizAnswer) quizRequest.getListAnswers().size(); 
0

Vous devrez appliquer adaptateur personnalisé au listview. Vérifiez ces liens:

Link 1 Link 3 Link 4. J'espère que cela vous sera utile. Jetez également un oeil à The world of listview. Vos doutes seront définitivement résolus, un tel tutoriel c'est.

Questions connexes