我有一个带有“自动完成”框的 Activity 。每当文本更改时,我都想调用Web服务,并用返回的新String []填充ArrayAdapter。这部分都很好用,但是当String []学校中有所有新值时,不会刷新UI中的列表。我的onCreate中填充的原始列表始终保留。

我在需要运行UI的同一线程上读取了需要更新的地方,因此我尝试了下面代码中列出的Runnable。但这不仅会更新我的类(class)变量学校,而且不能与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,请注明州。是否可以在自动下拉框中的第二行显示城市和州?仅用于格式化目的。如果可以的话,看起来会更干净。

谢谢!

最佳答案

您尝试过setNotifyOnChange(true)吗?每当使用更改列表(add(T), insert(T, int), remove(T), clear())的方法时,它都应该正确执行您的手动操作。也许您必须通过ArrayAdapter上的这些方法来修改数组?

我不确定ArrayAdapter是实际上持有对学校的引用,还是只是在构造ArrayAdapter时复制了内容。也许您可以看一下AOSP代码,以了解它们在该构造函数中的作用。

关于android - 动态刷新ArrayAdapter,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1967814/

10-12 02:46