10

Cihazların listesini görüntülemek için kullanıyorum bir ListView içeren bir ekran ile bir android uygulaması var. Bu cihazlar bir dizide tutulur.ArrayList ve List ile Android Array Bağdaştırıcısı arraylist değiştirilmediğinde güncellenmiyor

ArrayAdapter'i, ekrandaki bir dizide neyin listede olduğunu görüntülemek için kullanıyorum. İlk SetupActivity sınıfı yük zaman

Bu çalışır, bununla birlikte, tutma cihazları dizi güncellenir gelir AddDevice() yöntemi, yeni bir cihaz eklemek için tesis bulunmaktadır.

Listeyi güncelleştirmesi beklenen notifyDataSetChanged() kullanıyorum ama işe yaramıyor gibi görünüyor.

public class SetupActivity extends Activity 
{ 
    private ArrayList<Device> deviceList; 

    private ArrayAdapter<Device> arrayAdapter; 

    private ListView listView; 

    private DevicesAdapter devicesAdapter; 

    private Context context; 

    public void onCreate(Bundle savedInstanceState) //Method run when the activity is created 
    { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.setup); //Set the layout 

     context = getApplicationContext(); //Get the screen 

     listView = (ListView)findViewById(R.id.listView); 

     deviceList = new ArrayList<Device>(); 

     deviceList = populateDeviceList(); //Get all the devices into the list 

     arrayAdapter = new ArrayAdapter<Device>(this, android.R.layout.simple_list_item_1, deviceList); 

     listView.setAdapter(arrayAdapter); 
    } 

    protected void addDevice() //Add device Method (Simplified) 
    { 
     deviceList = createNewDeviceList(); //Add device to the list and returns an updated list 

     arrayAdapter.notifyDataSetChanged(); //Update the list 
} 
} 

Nerede yanlış gittiğimi gören var mı?

cevap

36

bir ArrayAdapter için kullanırsanız notifyDataSetChanged çalışır add, insert, remove ve Adaptör üzerindeki clear fonksiyonları.

  1. berrak Kullanım adaptörünü temizleyin - Yeni oluşan listeyi arrayAdapter.clear()
  2. Kullanım Adapter.add ve eklemek - arrayAdapter.add(deviceList)
  3. Çağrı notifyDataSetChanged

Alternatifler:

  1. tekrarlayın Yeni devicelist kurulduktan sonra bu adım - ama bu gereksiz

    arrayAdapter = new ArrayAdapter<Device>(this, android.R.layout.simple_list_item_1, deviceList); 
    
  2. size daha fazla esneklik verir BaseAdapter ve ListAdapter türetilen kendi sınıf oluşturun. Bu en çok tavsiye edilir.
0

yönteminiz addDevice sonsuz bir döngüye neden oluyor. Burada ne işin var gibi kendisinden bir yöntemi çağırmak Dont:

deviceList = addDevice(); 
+0

bother, bu sadece benim tarafımdaki bir yazım hatası oldu ... karışıklık için üzgünüm –

+0

hey pippa, onun serin, hayır biggy. – petey

+0

, createNewDeviceList() öğenizi yayınlayabilir, listenizde yeni bir şey eklemez ve orijinaldeki aynı öğelerle ve siparişle yeni listeyi oluşturmaz. – petey

9

Kabul edilen cevap problemi çözerken, bunun neden yanlış olduğunu açıklamakta ve bu önemli bir kavram olduğu için açıklığa kavuşturmaya çalıştığımı düşündüm. Slartibartfast'ın notifyDataSetChanged()'un yalnızca add, insert, remove veya , veya clear bağdaştırıcısında çağrılması açıklaması, yanlıştır. Bu açıklama, true olarak ayarlanırsa (varsayılan olarak olduğu gibi) bu dört eylemden herhangi biri gerçekleştiğinde otomatik olarak notifyDataSetChanged()'u arayacak olan setNotifyOnChange() yönteminin doğrudur. Sanırım afiş iki yöntemi karıştırdı. notifyDatasetChanged()'un kendisi bu kısıtlamalara sahip değildir. Sadece bağdaştırıcının aradığı listenin değiştiğini söyler ve listedeki değişikliklerin gerçekten nasıl gerçekleştiği önemli değildir. createNewDeviceList() için kaynak kodunu göremediğim halde, sorununun yarattığınız orijinal listeye başvuruda bulunduğunuzdan ve createNewDeviceList()'da yeni bir liste oluşturduğunuzdan ve bağdaştırıcıdan beri yeni bir liste oluşturduğundan tahmin ediyorum. eski listeye işaret ederek değişiklikleri göremedi.Çözüm slartibartfast belirtilen bağdaştırıcıyı temizler ve özellikle güncelleştirilmiş listeyi bu bağdaştırıcıya eklediğinden çalışır. Böylece adaptörünüzün yanlış yere işaret etme problemi yoktur. Umarım bu birisine yardım eder!