2012-02-28 2 views
1

Dans mon cas, j'ai deux affichage de texte et une case à cocher dans listview. J'utilise la classe ArrayAdapter pour définir les données dans textviews. Lorsque je sélectionne une case à cocher et que je défile dans la liste, des cases à cocher sont automatiquement sélectionnées. Je ne comprends pas pourquoi cela se passe ci-dessous est mon code s'il vous plaît regarder le code et donner la solution pour résoudre ce problème.Android listview avec case à cocher

public class Contacts_NumberActivity extends Activity { 
    /** Called when the activity is first created. */ 
    String nameList[] = { "U", "A", "B", "C", "D", "E", "F", "G", "H", 
      "I", "J", "L", "M", "N", "O", "P", "Q" }, numberList[] = { "1", 
      "2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", 
      "5", "6", "7" }; 
    ListView contactList; 
    boolean[] checked; 
    ContactHolder holder = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     contactList = (ListView) findViewById(R.id.contact_list); 

     contactList.setAdapter(new ContactAdapter(this, R.layout.list_item, 
       nameList, numberList)); 

    } 

    public class ContactAdapter extends ArrayAdapter<String> { 

     Context context; 
     int layoutResourceId; 
     String data[] = null; 
     String data1[] = null; 

     public ContactAdapter(Context context, int layoutResourceId, 
       String[] data, String[] data1) { 
      super(context, layoutResourceId, data); 
      this.layoutResourceId = layoutResourceId; 
      this.context = context; 
      this.data = data; 
      this.data1 = data1; 
     } 

     @Override 
     public View getView(final int position, View convertView, 
       ViewGroup parent) { 
      View row = convertView; 

      if (row == null) { 
       LayoutInflater inflater = ((Activity) context) 
         .getLayoutInflater(); 
       row = inflater.inflate(layoutResourceId, parent, false); 

       holder = new ContactHolder(); 
       holder.name = (TextView) row.findViewById(R.id.name); 
       holder.number = (TextView) row.findViewById(R.id.number); 
       holder.chkbox = (CheckBox) row.findViewById(R.id.checkBox1); 

       holder.chkbox 
         .setOnCheckedChangeListener(new OnCheckedChangeListener() { 

          @Override 
          public void onCheckedChanged(
            CompoundButton buttonView, boolean isChecked) { 

           holder.chkbox.setChecked(isChecked); 
           System.out.println("Checked possition= " 
             + isChecked); 
          } 

         }); 

       row.setTag(holder); 
      } else { 
       holder = (ContactHolder) row.getTag(); 
      } 

      holder.name.setText(data[position]); 
      holder.number.setText(data1[position]); 

      return row; 
     } 

     public class ContactHolder { 
      TextView name, number; 
      CheckBox chkbox; 
     } 
    } 
} 
+0

Je suppose que le problème avec l'impression de votre listview.Veuillez vérifier votre listview il peut avoir des données répétées, c'est pourquoi vous vous sentez comme automatiquement case à cocher est sélectionné .check et laissez-moi savoir que – OnkarDhane

+0

cela se produit lorsque j'ai cliqué sur une case à cocher et faites défiler la liste les cases à cocher ci-dessous sont également vérifiées. – user03

+0

vérifier ci-dessous les liens, il peut vous aider http://windrealm.org/tutorials/android/listview-with-checkboxes-without-listactivity.php http://developmentality.wordpress.com/2010/11/05/of-rubber -stamps-and-checkboxes-pourquoi-votre-listview-is-broken/ –

Répondre

0

votre code n'a pas de problème, mais le problème est dû au fait de la fonction getView de ArrayAdapter qui appelle de manière que, pour ré-initialiser et de réutiliser les lignes floues de liste pour que vous utilisez convertir vérification de vue qui est à l'origine radiomessagerie comme si l'écran vous cochez la première case, tous les écrans de radiomessagerie obtenir la première case à cocher cochée,

à se résoudre de cela, vous devez utiliser la mise en page au lieu de vue de la liste en utilisant l'adaptateur est un indice ici peut vous aider à

LinearLayout parent = new LinearLayout(this); 
parent.setOrientation(VERTICAL); 
parent.setLayoutParams(new LayoutParams(list_width,list_height); 

for(number of rows in your list) 
{ 
LinearLayout row= new LinearLayout(this); 
row.setOrientation(Horizontal); 
row.setLayoutParams(new LayoutParams(row_width,row_height); 

TextView text= new TextView (this); 
text.setText("your text"); 
text.setLayoutParams(new LayoutParams(text_width,text_height); 
row.addView(text); 
. 
.//other view you want to add as check box etc 
. 
. 
parent.AddView(row); 
} 

this.addView(parent); 

hope this will help you 

note: mais dans le cas où vous avez un grand nombre de lignes, il peut causer des problèmes de mémoire

Questions connexes