2009-12-28 3 views
4

У меня есть операция с полем автозаполнения. Всякий раз, когда текст изменяется, я хочу вызвать веб-службу и заполнить ArrayAdapter новой строкой []. Эта часть работает отлично, за исключением того, что в пользовательском интерфейсе список обновляется, когда в String [] школах есть все новые значения. Исходный список, заполненный в моем onCreate, всегда остается.Обновите ArrayAdapter динамически

Я прочитал где-то, что мне нужно было обновить в том же потоке, на котором работает пользовательский интерфейс, поэтому я попробовал Runnable, указанный в моем коде ниже. Но это, а также просто обновление моих классов переменных школ не работает вместе с notifyOnDataSetChange()

Где я иду не так?

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    schools = SchoolProxy.search("Co"); 
    autoCompleteAdapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line, schools); 
    autoComplete = (AutoCompleteTextView) findViewById(R.id.edit); 
    autoComplete.addTextChangedListener(textChecker); 
    autoComplete.setAdapter(autoCompleteAdapter); 
} 
    ... 
    .... 
    ... 

final TextWatcher textChecker = new TextWatcher() { 
    public void afterTextChanged(Editable s) {} 

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

    public void onTextChanged(CharSequence s, int start, int before, int count) 
    { 
    schools = SchoolProxy.search(s.toString()); 
    runOnUiThread(updateAdapter); 
    } 
}; 

private Runnable updateAdapter = new Runnable() { 
    public void run() { 
     autoCompleteAdapter.notifyDataSetChanged(); 
     } 

}; 

В качестве менее важного примечания стороны, если каждый пункт в школах имеет имя \ n город, штат. Возможно ли, чтобы город & находился на второй линии в автоматическом выпадающем списке? Только для форматирования. Если бы я мог, выглядел бы более чистым.

Спасибо!

ответ

6

Вы пробовали setNotifyOnChange(true)? Предполагается, что вы правильно выполняете то, что делаете вручную, когда используете методы, которые меняют список (add(T), insert(T, int), remove(T), clear()). Возможно, вам нужно изменить массив с помощью этих методов на ArrayAdapter?

Я не уверен, действительно ли ArrayAdapter имеет ссылку на школы или просто скопировал содержимое при построении ArrayAdapter. Возможно, вы можете взглянуть на код AOSP, чтобы узнать, что они делают в этом конструкторе.

+0

Я буду стараться добавлять верным способом сегодня. Если это не сработает, я попробую очистить адаптер, а затем прокрутить строку и добавить элементы отдельно (надеюсь, это не решение). Но я расскажу о своих выводах и соглашусь, если вы правы. – Nathan

+0

Я собираюсь идти вперед и предположить, что мне нужно очистить(), затем использовать либо add(), либо insert(). У меня была настройка данных как String []. Но я собираюсь экспериментировать, просто возвращая все это как JSONArray и выполняя цикл. Похожий: школы = SchoolProxy.search (s.toString()); для (int i = 0; i Nathan

0

После динамического изменения адаптера, нужно просто позвонить:

AutoCompleteTextView.showDropdown() 
Смежные вопросы