2013-09-26 4 views
6

bonjour j'ai créé un listview avec des cases à cocher dedans ... mais je ne sais pas comment obtenir le texte de la case à cocher qui sont sélectionnés .. voici le code de activity_main.xmlAndroid obtenir le texte de toutes les cases cochées dans la listeVoir

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/LinearLayout1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="top" 
    android:orientation="vertical" 
    tools:context=".MygamesActivity" > 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_marginTop="20dp" /> 

</LinearLayout> 

une autre disposition qui a des cases à cocher à afficher dans le listview main.list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <CheckBox 
     android:id="@+id/checkBox1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="CheckBox" 
     /> 
</LinearLayout> 

et c'est la classe qui étend arrayadapter

package com.wasiff.listview; 

import android.content.Context; 
import android.content.res.TypedArray; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.ImageView; 
import android.widget.TextView; 


public class CheckboxAdapter extends ArrayAdapter<String> { 
    private LayoutInflater mInflater; 

    private String[] mStrings; 
    private TypedArray mIcons; 
    private int mViewResourceId; 

    public CheckboxAdapter(Context ctx,int viewResourceId,String[] strings){ 
     super(ctx,viewResourceId,strings); 

     mInflater = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     mStrings = strings; 

     mViewResourceId = viewResourceId; 
    } 

    public int getCount(){ 
     return mStrings.length; 
    } 

    public String getItem(int position){ 
     return mStrings[position]; 
    } 

    public long getItemId(int position){ 
     return 0; 
    } 

    public View getView(int position,View convertView,ViewGroup parent){ 
     convertView = mInflater.inflate(mViewResourceId, null); 

     CheckBox tv = (CheckBox)convertView.findViewById(R.id.checkBox1); 
     tv.setText(mStrings[position]); 

     return convertView; 
    } 
} 

et ceci est ma classe MainActivity

package com.wasiff.listview; 

import android.app.ListActivity; 
import android.content.Context; 
import android.content.res.Resources; 
import android.content.res.TypedArray; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.View; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.Button; 
import android.widget.ListAdapter; 
import android.widget.ListView; 

public class MainActivity extends ListActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Context ctx = getApplicationContext(); 
     Resources res = ctx.getResources(); 

     String[] options = res.getStringArray(R.array.countrynames); 

     setListAdapter((ListAdapter) new CheckboxAdapter(ctx,R.layout.main_list_item,options)); 

    } 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

et enfin j'ai tous les pays enregistrés dans un fichier countries.xml sur les valeurs dossier

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string-array name="countrynames" translatable="false"> 
     <item>Bhutan</item> 
     <item>Colombia</item> 
     <item>India</item> 
     <item>Pakistan</item> 
     <item>Australia</item> 
     <item>Srilanka</item> 
     <item>England</item> 
    </string-array> 
</resources> 

il montre les cases à cocher dans le listView maintenant ce que je veux est d'obtenir le texte des cases à cocher qui sont vérifiées et montrer dans un toast sur un clic de bouton (pour tester) j'ai suivi le tutoriel sur le livre de recettes android par oreilly mais je ne sais pas comment définir l'écouteur

Répondre

18

Ajouter à l'intérieur CheckboxAdapter.java

ArrayList<String> selectedStrings = new ArrayList<String>(); 

ensuite à l'intérieur méthode getView

tv.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (isChecked) { 
        selectedStrings.add(tv.getText().toString()); 
       }else{ 
        selectedStrings.remove(tv.getText().toString()); 
       } 

      } 
     }); 

Écrire un getter qui retournera selectedStrings

ArrayList<String> getSelectedString(){ 
    return selectedStrings; 
} 
+1

Thankss son fonctionnement :) –

+0

Problème avec la solution est qu'il ne maintient pas l'ordre des cases à cocher –

+0

à l'intérieur de onCheckedChanged utiliser buttonView.getText au lieu de tv.getText – temirbek

1

On approche pourrait être de passer un objet propre à votre Arrayadapter:

class ArrayItem{ 
    private String text; 
    private boolean checked; 
    ... (getter/setter) 
} 

et juste obtenir le tableau utilisé en arrière de Arrayadapter et de le lire.

Arrayadaper...{ 

    public ArrayList<ArrayItem> getList(){ 
     return this.arrayList; 
    } 

    public View getView(int position,View convertView,ViewGroup parent){ 
     ArrayItem item = this.arrayList.get(position) 
     convertView = mInflater.inflate(mViewResourceId, null); 

     CheckBox tv = (CheckBox)convertView.findViewById(R.id.checkBox1); 
     tv.setCheckChangeListener... //item.setChecked(true:false) 
     tv.setText(mStrings[position]); 

     return convertView; 
    } 
} 


} 

Vous pouvez parcourir la liste et juste manipuler les éléments cochés == true où

Hope this helps.

13

Peut être cette volonté vous a aidé:

CheckBox cb; 
    ListView mainListView = getListView(); 
    for (int x = 0; x<mainListView.getChildCount();x++){ 
     cb = (CheckBox)mainListView.getChildAt(x).findViewById(R.id.myCheckBox); 
     if(cb.isChecked()){ 
      doSomething(); 
     } 
    } 
+0

J'aime vraiment celui-ci! –

+0

@Saif Hamed Cela fonctionne pour moi ... –

+0

Cela ne fonctionnera que pour les éléments visibles dans la liste. – c0m4

0
SparseBooleanArray checked = listView1.getCheckedItemPositions(); 
       ArrayList<String> selectedItems = new ArrayList<String>(); 

       for (int i = 0; i < len; i++) { 
        if (checked.get(i)) 
         selectedItems.add((String) adapter.getItem(i)); 
       } 
       String[] outputStrArr = new String[selectedItems.size()]; 

       for (int i = 0; i < selectedItems.size(); i++) { 
        outputStrArr[i] = selectedItems.get(i); 
       } 
Questions connexes