2010-09-08 82 views
2

我寫以下應用:notifyDataSetChanged不起作用?

  • 存在AutoCompleteTextView字段
  • 作爲適配器我使用ArrayAdapter與ListArray
  • 的ListArray由一些字符串常量項和一個項目,這將被動態地改變的每次用戶輸入字段中的東西

我帶了TextChangedListener來更新這最後一個列表項。但看起來,更新只發生一次。

我添加了一些我的代碼。可能有人會告訴我,我做錯了什麼。

public class HelloListView extends Activity 
{ 
    List<String> countryList = null;  
    AutoCompleteTextView textView = null; 
    ArrayAdapter adapter = null; 

    static String[] COUNTRIES = new String[] 
    { 
      "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", 
      "Yemen", "Yugoslavia", "Zambia", "Zimbabwe", "" 
    }; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main);   

     countryList = Arrays.asList(COUNTRIES); 

     textView = (AutoCompleteTextView) findViewById(R.id.edit); 
     adapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, countryList); 
     adapter.notifyDataSetChanged();   
     textView.setAdapter(adapter); 
     textView.setThreshold(1); 

     textView.addTextChangedListener(new TextWatcher() 
     { 

      public void onTextChanged(CharSequence s, int start, int before, int count) 
      {    
       countryList.set(countryList.size()-1, "User input:" + textView.getText());     
      } 

      public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) 
      {    
      } 

      public void afterTextChanged(Editable s) 
      { 
      } 
     }); 

     new Thread() 
     { 
      public void run() 
      { 
       // Do a bunch of slow network stuff. 
       update(); 
      } 
     }.start();   
    } 

    private void update() 
    { 
     runOnUiThread(new Runnable() 
     { 
      public void run() 
      { 
       adapter.notifyDataSetChanged(); 
      } 
     }); 
    } 
} 
+0

不知道你爲什麼不起作用,但你有沒有考慮使用AsyncTask做你的網絡東西?它給你一個簡單的方法來在另一個線程上工作,然後在UI線程上做一些工作。 http://developer.android.com/reference/android/os/AsyncTask.html – 2010-09-08 17:48:36

+0

但是,如果你看看我的例子,根本沒有網絡的東西。我有ArrayList的數據已經在代碼中。 – Tima 2010-09-09 06:48:16

+0

嘗試了您的建議。它不起作用 – Tima 2010-09-11 09:46:16

回答

11

請勿修改ArrayList。修改ArrayAdapter,使用add(),insert()remove()。您無需擔心notifyDataSetChanged()

另外,我同意梅拉 - 考慮用AsyncTask代替你的線程和runOnUiThread()的組合。

+0

我有一個建議,使用stackoverflow runOnUIThread。添加,插入和刪除操作在我的情況下不是很好。我想只有一個項目,我會改變。 – Tima 2010-09-08 18:50:55

2

在功能onTextChanged(),創建一個新的適配器和連接它,然後它會工作:

countryList.set(countryList.size()-1, "User input:" + textView.getText());  
adapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, countryList); 
textView.setAdapter(adapter); 

看來,這是不是一個完美的人,但它的工程!

+0

感謝您的幫助! – DigaoParceiro 2017-06-11 23:34:15

相關問題