2010-09-08 2 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 для создания сетевых материалов? Это дает вам простой способ сделать работу над другим потоком, а затем немного поработать над потоком пользовательского интерфейса, когда его ден. http://developer.android.com/reference/android/os/AsyncTask.html –

+0

Но если вы посмотрите на мой пример, то вообще нет сетевого контента. У меня есть данные ArrayList уже в коде. – Tima

+0

Пробовал ваше предложение. Это не работает – Tima

ответ

11

Не изменяйте ArrayList. Измените ArrayAdapter, используя add(), insert() и remove(). Вам не нужно беспокоиться о notifyDataSetChanged().

Кроме того, я согласен с Mayra - рассмотрим возможность использования AsyncTask вместо вашей нити и комбинации runOnUiThread().

+0

У меня есть предложение использовать runOnUIThread с помощью stackoverflow. добавлять, вставлять и удалять операции не очень приятно в моем случае. Я хотел бы иметь только один элемент, я изменюсь. – Tima

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

Смежные вопросы