2012-07-11 21 views
6

Android'i öğrenmek için örnek bir uygulama üzerinde çalışıyorum. Çoklu seçim listesi göstermesi ve kullanıcı düğmeyi tıkladığında en üstte bir TextView'de seçilen öğeleri görüntülemesi gerekir. Görünen öğeleri ListView'den almaya çalıştığımda boş bir dizinin her zaman geri döndüğü anlaşılıyor. Bana bunun neden böyle olduğunu ve neyin doğru çalıştığını anlamak için eksik olduğumu açıklayan biri var mı? İştegetListView() kullanılırken boş dizi getCheckedItemIds()

düzen xml dosyası olduğu (Bilginize kod Grant Allen tarafından Başlangıçtan Android 4'ten değiştirilmiş programdır):

<?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> 

Ve burada ilişkili Java geçerli:

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]);   
     } 

    } 

} 

cevap

12

Bkz, getCheckedItemIds() yöntemi, yalnızca bağdaştırıcınızın sabit kimlikleri varsa geçerli bir sonuç döndürür. Bunun yerine bu size yardımcı olacaktır

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

Hope =)

+0

Müthiş teşekkürler bunun için bir demet kullanabilirsiniz. Bir takip olarak sadece kimlikleri tam olarak sabit kılan şey hakkında biraz açıklama isteyebilir miyim? –

+0

Evet Ayrıca bilmek isterim. Sanırım her bir kimlik her zaman aynı nesneye karşılık gelir, ancak dokümantasyon hiç de açık değildir. – Timmmm

+3

, örneğin BaseAdapter'daki hasStableIds() yöntemini geçersiz kılabilir ve getId() öğeniz düzgün bir şekilde uygulanmışsa, bunun doğru olmasına izin verebilirsiniz. – Ostkontentitan

İlgili konular