动态刷新ArrayAdapter

时间:2009-12-28 03:09:19

标签: android autocomplete

我有一个带有自动完成框的活动。每当文本更改时,我想调用Web服务并使用返回的新String []填充ArrayAdapter。这部分一切都很好,除了在String []学校中有所有新值时UI中的列表没有被刷新。我的onCreate中填充的原始列表始终保留。

我在某处需要在运行UI的同一个线程上更新它,所以我尝试了下面代码中列出的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 city,n。是否有可能拥有这座城市和城市。在自动下拉框中的第二行说明?仅用于格式化目的。如果可以,会看起来更清洁。

谢谢!

2 个答案:

答案 0 :(得分:6)

你试过setNotifyOnChange(true)吗?无论何时使用更改列表(add(T), insert(T, int), remove(T), clear())的方法,都应该正确地执行您正在执行的操作。也许您必须通过ArrayAdapter上的这些方法修改数组?

我不确定ArrayAdapter是否实际上持有对学校的引用,或者只是在构建ArrayAdapter时复制了内容。也许你可以看看AOSP代码,看看他们在那个构造函数中做了什么。

答案 1 :(得分:0)

动态更改适配器后,只需要调用:

AutoCompleteTextView.showDropdown()