Soru Çoklu Seçim Listesi Görünümünden Seçilen öğeler nasıl alınır?


Bir dizi bağdaştırıcısı kullanıyorum ve bu dizinin bir dizi listesini ekliyorum s, listenin çok seçtiği, tıklatılan liste öğelerinin değerlerini nasıl alabilirim?

my_contacts_list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice,conts_list);
  my_contacts_list.setAdapter(adapter);

Bunu yapmaya çalışıyordum

SparseBooleanArray positions = my_contacts_list.getCheckedItemPositions();
  int size=positions.size();
  int i=0;
  while(i <= size){
   conts_list.get(positions.get(i));
   i++;
  }

Ama position.get (i) bir dizi listesi, sonra seçilen öğelerin nasıl alınacağı?


44
2018-01-04 05:15


Menşei


MultiAutoCompleteTextView kullanıyor musunuz? - GSree
@preethi bu cevabı kontrol etmek, yardımcı olabilir: stackoverflow.com/a/20171191/919216 - Chanakya Vadla


Cevaplar:


SparseBooleanArray.get bir boolean döndürür, ancak listenizdeki her konum için kontrol etmeniz gerektiğine inanıyorum.

int len = listView.getCount();
SparseBooleanArray checked = listView.getCheckedItemPositions();
for (int i = 0; i < len; i++)
 if (checked.get(i)) {
  String item = cont_list.get(i);
  /* do whatever you want with the checked item */
 }

43
2018-01-04 05:25



Bu cevap yanlış, denedin mi? ya da benim için sadece yanlış mı?, benim durumumda ilk yedi doğru ve yanlış kalan, sadece 12 sonuç var benim çoklu seçim listesindeki toplam öğeler 42 oldu, seyrek boolean anahtar benim liste işaret etti indeksler, lütfen cevabınızı düzeltin çünkü doğru cevap olarak işaretlendi, çünkü yanlış cevap verdikten sonra birisinin başarısız olması için nefret ediyorum. - Shereef Marzouk
Benim için çalışmıyor. Roger Keays cevap veriyor. - ctekk
Bu örnekteki sapık, cont_list'in adaptöre verilen orijinal Listeniz olduğunu bildiğimi düşünüyorum. Bunu göz önüne alındığında, bunu yapamazsınız nasıl emin değilim. checked.get (i), eğer indeks, i orijinal adaptöre param olarak iletilen orijinal List maddesinde kontrol edilirse, sadece TRUE değerini döndürecektir. - Todd Painton
Kısa ve faydalı cevap, teşekkürler. - Ronak Mehta
Bu benim için çalışıyor. harika ve teşekkürler - Jack


Bu API bir karmaşadır. İşte benim için ne işe yarıyor.

SparseBooleanArray checked = tags.getCheckedItemPositions();
for (int i = 0; i < checked.size(); i++) {
    if(checked.valueAt(i)) {
        Tag tag = (Tag) tags.getItemAtPosition(checked.keyAt(i));
        Log.i("xxxx", i + " " + tag);
    }
}

43
2017-12-22 02:15



Bu benim için çalışmıyor. Daren'in çözümü yerine benim için çalışır. - Cheok Yan Cheng
Öğe ögesi görünümü öğesindeki öğe nasıl seçilir, ancak tüm öğeler nasıl seçilir? Solid Explorer'da olduğu gibi - DavyJonesUA
Benim için checked.size () her zaman 0 değerini döndürür ve değerler ilk başta 12'ye ulaşır, ancak doğru anahtar / değer çiftleriyle. Bu yüzden, IndexOutOfBoudsException ile karşılaştığımda yinelemenin sınırını almak ve bitirmek için ListView'in getCount'unu kullanıyorum. Çirkin cehennem gibi ama şimdiye kadar çalışıyor. - sfratini
Listedeki kontrol edilen öğeler grubunu döndürür. Sonuç sadece seçim modu CHOICE_MODE_NONE olarak ayarlanmadıysa geçerlidir. - Jijo Thomas
ne belirsiz bir cevap. beni yanlış anlama. dil sözdizimini kastediyorum. - Ali.Rashidi


Bunun hakkında bilgi almanın en hızlı yolunun olduğuna inanıyorum. SparseArray Anahtarlar üzerinde yineleme yapmaktır (aslında yukarıdaki çözümlerin her durumda çalışmayacağından eminim). ListView bir çift (dizin, doğru) girecek SparseBooleanArray seçilen her endeks için.

Yani kod şöyle görünebilir:

SparseBooleanArray checked = lv.getCheckedItemPositions();
int size = checked.size(); // number of name-value pairs in the array
for (int i = 0; i < size; i++) {
    int key = checked.keyAt(i);
    boolean value = checked.get(key);
    if (value)
        doSomethingWithSelectedIndex(key);
}

17
2017-09-13 12:36



Benim için çalışıyor. Bu kod, diğerlerinin geri kalanından çok okunabilir. - Cheok Yan Cheng
Benim için de çalışıyor. ve ayrıca çok anlaşılabilir kod - Ahmed Aeon Axan
Bu doğru bir cevap - thoitbk


Bence Daren Robbins'in Cevabı Yanlış, işte benim cevabım:

ArrayList<String> ids = extras.getStringArrayList("commonids");
SparseBooleanArray checked = lv.getCheckedItemPositions();
for (int i = 0; i < checked.size(); i++) {
    if(checked.get(i))
        Log.i("CheckedItem", ids.get(checked.indexOfKey(i)));
}

Ids, liste görünümündeki öğelerin kimliklerini içeren liste görünümünün aynı boyutuna sahip bir arraylist olduğunu varsayalım.


4
2017-12-04 11:00





Şey, tüm liste görüntüleme öğelerini yinelemeli, ancak kontrol edilmeyenler değil.

Değişkenleri tanımla:

  • listView (ListView örneğiniz)
  • isimler (ArrayList iseniz)
  • saveCheckedName (tüm kontrol edilen isimleri bu Arraylist'e kaydet)

     SparseBooleanArray checkedPositions = listView.getCheckedItemPositions();
        for (int i = 0; i < subjectListView.getCount(); i++) {
                        if (checkedPositions.get(i) == true) {
                            saveCheckedName.add(names.get(i));
                        }
                    }
    

3
2017-09-26 21:51





Diğer birçok şey gibi, çoklu seçim ListViewAndroid'de gerçek bir sorun var.

Seçilen öğeleri basitçe talep etmek yerine List arasında Objects (sevgili Google, beklediğimiz şey bu):

List selected_items = my_list_view.getSelectedItems();

Bu muazzam saçma API'yı kullanmak zorundayız:

SparseBooleanArray checked = my_list_view.getCheckedItemPositions();
    int num_selected = 0;
    for(int i = 0; i < checked.size(); i++) {
        if(checked.valueAt(i)) {
            num_selected++;
            int key = checked.keyAt(i);
            boolean value = checked.get(key);
            if (value) {
                //
            }
        }
    }

Korkunç adlı SparseBooleanArray adını daha da korkunç olarak çağırarak doldurulur getCheckedItemPositions() üzerinde ListView. Ancak seçilen / kontrol edilen öğenin listedeki konumlarını döndürmek yerine, listedeki her öğenin konumunu döndürür. Şimdiye kadar seçilmiş olsun ya da olmasın, hiç dokunmadı! İnanılmaz ama gerçek.

Öğenin AKTİF olarak MEVCUT kontrol edilip edilmediğini hesaplamak için test etmek zorundayız. valueAt(i) 'dokunulmamış' bir dizi nesnenin içinden geçerken doğruluk için.

Bu deliliğe ek olarak, seçilen öğelerin sayısını hesaplamak istiyorsak, kendi sayacımızı arttırmak zorunda kalıyoruz (ör. num_selected).

Bunun gibi API'larla, küçük meraklıların meraklıları çok şaşkın!


3
2018-01-26 17:15





ISSUE'umu ikinci bir ArrayList ile NASIL ÇÖZÜM EDİYORUM:

  1. İkinci bir ArrayList örneği oluşturuldu
  2. UNCHECKED öğelerle ArrayList örneğini güncellendi
  3. listadapter'ime ekledi

    public void removeSelectedItems(){
    
    updatedList = new ArrayList<String>(); //initialize the second ArrayList
    
    int count = lv.getCount();  //number of my ListView items
    SparseBooleanArray checkedItemPositions = getListView().getCheckedItemPositions();
    for (int i=0;i < count;i++){
        if(!checkedItemPositions.get(i))
    
        updatedList.add(liveNames.get(i)); //liveNames is the current ArrayList     
        Log.e("TEST", liveNames.get(i));
    }
    
    adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_multiple_choice, updatedList);
    
    setListAdapter(adapter);}
    

Umarım yardımcı olur :)


1
2018-02-10 12:58