2013-03-06 53 views
1

我正在使用包含用戶輸入的字符串的ListView的程序。我希望它在用戶單擊按鈕後列出每個字符串。此外,我希望ListView中顯示的每個字符串值也位於數組中,以便稍後可以處理列表。這就是我現在所擁有的:添加新String到列表中,你只需要使用您的適配器,它告訴適配器更新的notifyDataSetChanged()正在更新ListView

FATAL EXCEPTION: main 
java.lang.UnsupportedOperationException 
at java.util.AbstractList.add(AbstractList.java:404) 
at java.util.AbstractList.add(AbstractList.java:425) 
at android.widget.ArrayAdapter.add(ArrayAdapter.java:179) 
at MainActivity$1.onClick(MainActivity.java:38) 
+0

什麼是變量'選擇'你似乎沒有在你發佈的代碼中聲明它。 – FoamyGuy 2013-03-06 20:11:54

+0

道歉,我編輯它。這是一個類變量 – 2013-03-06 20:28:00

+0

好吧,我編輯我的答案與您需要修復它的信息。我將再次編輯您的帖子以添加您移除的標籤。請讓他們有這個時候,使用特定的標籤保留本網站舉辦的,它給你一個更好的機會得到來自人的答案,因爲很多人「最喜歡」的標籤,他們在 – FoamyGuy 2013-03-06 21:57:05

回答

1

您的列表不更新的原因是,你是不是曾經將您的數據項的適配器。您只將它們添加到choicesArray這是您傳遞給新的ArrayAdapter()構造函數的數組。

該構造函數不適配器綁定到數組,但基本上覆制到陣列的適配器(在你調用構造函數的時間)後到陣列的變更不會在一個ArrayAdapter中反映出來。

我喜歡這樣認爲ArrayAdapter <>與ArrayList <>基本上是一樣的,並且可以爲某些AdpaterView父項生成子視圖。您可以將它傳遞給array[]以開始,它將使用該數組中的值進行初始化,但它不會將數組鏈接到適配器或ListView。在最初的構造函數調用之後,任何一個變化都不會反映在另一個變體中。

所以,你應該改變你的代碼看起來像這樣:

addButton.setOnClickListener(new View.OnClickListener() { 

    public void onClick(View v) { 
     EditText editText = (EditText) findViewById(R.id.edit_choice); 
     String message = editText.getText().toString(); 
     adapter.add(message); 

     //adapter.notifyDataSetChanged(); //<-- you might need to call this, but I think it might work without if you do it this way. 
     //listView.setAdapter(adapter); //<-- you shouldn't need to call this each time. Once at the begining is enough. 
    } 
}); 

編輯:

改變你的ArrayAdapter的構造和刪除choiceArray參數,所以你應該會留下這樣的:

final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
     android.R.layout.simple_list_item_1, android.R.id.text1); 

之後,我認爲你應該很好去。本質上,問題在於,由於您傳遞的是數組,因爲數組的大小是固定的(您的長度爲1),所以不允許添加任何內容。如果你願意,我懷疑你可以使用ArrayList<String>而不是String[],但對於你的情況,我認爲只要跳過這個參數並直接添加項目到你的適配器將會更容易,只要你需要添加新的。

+0

添加語句adapter.add(消息)的字符串;創建一個強制關閉應用程序的錯誤 – 2013-03-06 21:24:51

+0

編輯你的問題,幷包含stacktrace的相關部分,它顯示了什麼是異常。 – FoamyGuy 2013-03-06 21:27:34

+0

我編輯了我的問題,謝謝你的建議,我習慣了這個網站上的禮儀! – 2013-03-06 21:40:19

0

public ArrayList<String> choices = new ArrayList<String>(); 
public String[] choicesArray; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final ListView listView = (ListView) findViewById(R.id.listView1); 
    choicesArray = new String[] { "You have not entered a choice yet" }; 
    final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, android.R.id.text1, 
      choicesArray); 
    listView.setAdapter(adapter); 

    final Button addButton = (Button) findViewById(R.id.Button1); 
    addButton.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      EditText editText = (EditText) findViewById(R.id.edit_choice); 
      String message = editText.getText().toString(); 
      adapter.add(message); 

      //choices.add(message); 
      //choicesArray = choices.toArray(choicesArray); 

      //listView.setAdapter(adapter); 
     } 
    }); 
} 

此代碼創建一個錯誤顯示,它會用新的字符串

addButton.setOnClickListener(new View.OnClickListener() { 

    public void onClick(View v) { 

     EditText editText = (EditText) findViewById(R.id.edit_choice); 
     String message = editText.getText().toString(); 
     choices.add(message); 
     choicesArray = choices.toArray(choicesArray); 

     adapter.notifyDataSetChanged(); 

    } 
}); 

更新更新ListView

你應該考慮這種變化太

choicesArray = new String[choices.size()]; 
choicesArray = choices.toArray(choicesArray); 
+0

答案聽起來不錯,但爲什麼更新?看起來你只是無緣無故地創建一個新的String [],因爲你立即重新分配它。 – Geobits 2013-03-06 20:37:26

+0

我基本上要添加的字符串值到現有數組列表(其必須被轉換到一個數組),並且具有數組列表在列表視圖中被顯示。添加adapter.notifyDataSetChanged();聲明沒有幫助,並且更新導致我的程序根本不工作 – 2013-03-06 20:43:03

+0

你得到了什麼樣的異常? – 2013-03-06 21:00:34