10

我有一個Android應用程序,包含一個ListView,我用它來顯示設備列表的屏幕。這些設備保存在一個陣列中。陣列列表和列表視圖Android陣列適配器不更新時陣列列表更改

我想使用ArrayAdapter來顯示列表中屏幕上的數組。

它的工作原理,當我第一加載SetupActivity類,然而,存在該設施在的AddDevice()方法,這意味着在陣列保持裝置被更新添加新設備。

我正在使用notifyDataSetChanged()這應該是更新列表,但它似乎不工作。

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

任何人都可以看到我要去哪裏嗎?

回答

36

對於一個ArrayAdapter,如果使用notifyDataSetChanged不僅工程addinsertremove,並在適配器clear功能。

  1. 使用Clear清除適配器 - arrayAdapter.clear()
  2. 使用Adapter.add並加入新成立的名單 - arrayAdapter.add(deviceList)
  3. 呼叫notifyDataSetChanged

替代方案:

  1. 重複在新的設備列表形成之後這一步驟 - 但是這是 冗餘

    arrayAdapter = new ArrayAdapter<Device>(this, android.R.layout.simple_list_item_1, deviceList); 
    
  2. 創建一個從BaseAdapter和ListAdapter派生自己的類 爲您提供了更多的靈活性。這是最值得推薦的。
0

您的方法addDevice正在導致無限循環。不要從自身調用一個方法像你在這裏做什麼:

deviceList = addDevice(); 
+0

麻煩,這只是我的一個錯字...抱歉的混亂 –

+0

嘿pippa,它很酷,沒有biggy。 – petey

+0

你可以發佈你的createNewDeviceList()嗎?它的機會是它不會向你的列表中添加任何新東西,並在原始中創建具有相同元素和順序的新列表 – petey

9

雖然接受的答案解決了這個問題,但爲什麼不正確的解釋,以及這是一個重要的概念,我想我會試圖澄清。 Slartibartfast的說明notifyDataSetChanged()僅適用於在適配器上調用addinsertremoveclear時出錯。這種解釋對於setNotifyOnChange()方法是正確的,如果設置爲true(因爲它是默認的),當這四個動作中的任何一個發生時,將自動調用notifyDataSetChanged()。我認爲海報混淆了這兩種方法。 notifyDatasetChanged()本身沒有這些限制。它只是告訴適配器它正在查看的列表已經改變,並且實際發生的列表更改如何並不重要。雖然我看不到您的createNewDeviceList()的源代碼,但我想您的問題來自於您的適配器引用了您創建的原始列表,然後您在createNewDeviceList()中創建了一個新列表,並且由於適配器仍然指向舊列表,它無法看到變化。解決方案slartibartfast提到的作品,因爲它清除適配器,並專門添加更新列表到該適配器。因此,您不會遇到適配器指向錯誤位置的問題。希望這可以幫助別人!