2012-07-11 11 views
6

Pracuję nad przykładową aplikacją, aby poznać Androida. Powinien wyświetlać listę wielokrotnego wyboru, a gdy użytkownik kliknie przycisk, powinien wyświetlić elementy wybrane w TextView na górze. Wydaje się, że kiedy próbuję pobrać wybrane elementy z ListView, zawsze zwracana jest pusta tablica. Czy ktoś może mi wyjaśnić, dlaczego tak jest i czego mi brakuje, aby działał poprawnie? (FYI kod jest zmodyfikowany program od początku Android 4 Grant Allen)Pusta tablica podczas korzystania z getListView(). GetCheckedItemIds()

Oto plik układ xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
    <TextView 
     android:id="@+id/selection" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 
    <Button 
     android:id="@+id/getSelections" 
     android:text="Show Selections" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="listSelected" /> 
    <ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:drawSelectorOnTop="false" 
     android:choiceMode="multipleChoice" /> 
</LinearLayout> 

I tu jest związany Java:

package com.commonsware.android.checklist; 

import android.os.Bundle; 
import android.app.ListActivity; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.view.*; 

public class ChecklistDemo extends ListActivity { 
    private static final String[] items={"lorem", "ipsum", "dolor", 
        "sit", "amet", 
        "consectetuer", "adipiscing", "elit", "morbi", "vel", 
        "ligula", "vitae", "arcu", "aliquet", "mollis", 
        "etiam", "vel", "erat", "placerat", "ante", 
        "porttitor", "sodales", "pellentesque", "augue", "purus"}; 

    private TextView selection; 

    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 
     setListAdapter(new ArrayAdapter<String>(this, 
               android.R.layout.simple_list_item_multiple_choice, 
               items)); 
     selection = (TextView)findViewById(R.id.selection); 

    } 

    public void listSelected(View view) { 
     long[] chosenOnes = getListView().getCheckedItemIds(); 
     selection.setText("Items selected: "); 
     selection.setText(Integer.toString(chosenOnes.length)); 
     for (long x:chosenOnes) { 
      int i = Long.valueOf(x).intValue(); 
      selection.setText(selection.getText() + ", " + items[i]);   
     } 

    } 

} 

Odpowiedz

12

Zobacz doc, metoda getCheckedItemIds() zwraca poprawny wynik tylko wtedy, gdy adapter ma stabilne identyfikatory. Zamiast tego można użyć

SparseBooleanArray array = this.getListView().getCheckedItemPositions();

nadzieję, że to pomoże ci =)

+0

Awesome, wielkie dzięki za to grono. Czy w dalszej kolejności mogę poprosić o wyjaśnienie, co dokładnie sprawia, że ​​identyfikatory są stabilne? –

+0

Tak, chciałbym też wiedzieć. Zgaduję, że oznacza to, że każdy id zawsze odpowiada temu samemu obiektowi, ale dokumentacja nie jest jasna. – Timmmm

+3

można zastąpić metodę hasStableIds() w BaseAdapter na przykład, i niech zwróci true, jeśli twoja funkcja getId() jest poprawnie zaimplementowana. – Ostkontentitan

Powiązane problemy