2010-08-12 16 views
10

Edit: Okay, ich habe eine Lösung gefunden. Ich weiß nicht, dass es die richtige Lösung ist, aber es funktioniert richtig. Dem folgenden Code hinzugefügt.Rückgabewerte aus Mehrfachauswahl ListView

Ich versuche, einem Benutzer zu ermöglichen, eine Anzahl von Verzeichnissen aus einer Prüfliste auszuwählen und sie nach dem Klicken auf eine Schaltfläche "Senden" zurückzugeben. Hier ist ein Ausschnitt meines Codes. Es füllt das ListView mit allen Verzeichnissen auf/sdcard /, und für die anfängliche Auswahl (von wie vielen ich auch wähle), wenn ich absende, zeigt das Protokoll die richtigen Auswahlen an, die zurückgegeben werden. Wenn ich jedoch ein Element deaktiviere und erneut auf "Senden" klicke, wird es immer noch so angezeigt, als wären alle ausgewählt. Muss ich einen Handler schreiben, um ein Element zu deaktivieren? Ich dachte, das wurde durch die selectMode Auswahl erledigt? Vielen Dank!

private SparseBooleanArray a;  
directoryList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, directoryArray)); 
    submitButton = (Button)findViewById(R.id.submit_button); 
    submitButton.setOnClickListener(new OnClickListener() 
     { 
     @Override 
     public void onClick(View v) 
     { 
      a = new SparseBooleanArray(); 
      a.clear(); 
      a = directoryList.getCheckedItemPositions(); 

      for (int i = 0; i < a.size(); i++) 
      { 
       //added if statement to check for true. The SparseBooleanArray 
       //seems to maintain the keys for the checked items, but it sets 
       //the value to false. Adding a boolean check returns the correct result.      
       if(a.valueAt(i) == true) 
        Log.v("Returned ", directoryArray[a.keyAt(i)]); 

      }     
     } 
    }); 

Antwort

3

Habe etwas mehr Debugging und fand eine Lösung, die für mich funktionierte. Oben in Code bearbeitet. Aus irgendeinem Grund wird das SparseBooleanArray nicht selbst leer; Es behält die Schlüssel der Kästchen bei, die überprüft wurden. Wenn getCheckedItemPositions() aufgerufen wird, wird VALUE jedoch auf false festgelegt. Der Schlüssel befindet sich also immer noch im zurückgegebenen Array, hat jedoch den Wert false. Nur die aktivierten Kontrollkästchen werden mit dem Wert true gekennzeichnet.

1

bedeutete nicht, dies als Antwort zu tun, aber ich musste erweitern, was Sie getan haben, um Multi-Select zu tun. Warum haben Sie eine Feldvariable für Ihre Auswahl erstellt? Ich habe gerade lokale SparseBooleanArray ...

public class NaughtyAndNice extends ListActivity { 
TextView selection; 
String[] items={"lorem","ipsum", "dolor", "sit", "amet", 
     "consectetuer", "adipisc", "jklfe", "morbi", "vel", 
     "ligula", "vitae", "carcu", "aliequet"}; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,items)); 
      selection = (TextView)findViewById(R.id.selection); 
    this.getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
} 

public void onListItemClick(ListView parent, View view, int position, long id){ 
    SparseBooleanArray choices = parent.getCheckedItemPositions(); 
    StringBuilder choicesString = new StringBuilder(); 
    for (int i = 0; i < choices.size(); i++) 
    { 
    //added if statement to check for true. The SparseBooleanArray 
    //seems to maintain the keys for the checked items, but it sets 
    //the value to false. Adding a boolean check returns the correct result.      
     if(choices.valueAt(i) == true) 
      choicesString.append(items[choices.keyAt(i)]).append(" "); 

    } 
    selection.setText(choicesString); 
} 
} 

+0

es scheint schrecklich ineffizient, die for-Schleife zu tun und dann innerhalb der for-Schleife tun eine keyAt ... wie schlecht läuft keyAt? oh well – JDPeckham

+0

Ich verstehe nicht den Unterschied in diesem Code ... es scheint mit meiner funktional identisch zu sein. – kcoppock

+0

Oh vergiss ich deine Frage. Es gab keinen wirklichen Grund, eine Klassenvariable für die SBA zu machen, ich war nur neu in Java und Android und habe es dumm gemacht. :) – kcoppock

4

Ich weiß, dass Sie eine Lösung gefunden, die für Sie arbeitet, aber die sauberere und einfachere Lösung, die wahrscheinlich die meiste Arbeit Zeit ist dies (ich möchte alle IDs der ausgewählten Elemente beibehalten):

(in meiner ListActivity):

SparseBooleanArray selectedPos = getListView() 
     .getCheckedItemPositions(); 

ListAdapter lAdapter = getListAdapter(); 
List<Long> ids = new LinkedList<Long>(); 
    for (int i = 0; i < lAdapter.getCount(); i++) { 
    if (selectedPos.get(i)) { 
     ids.add(lAdapter.getItemId(i)); 
    } 
} 
1

Keine Notwendigkeit SparseBooleanArray choices = parent.getCheckedItemPositions();

StringBuilder zu verwenden ist dafür ausreichend.