我有一个带有“自动完成”框的 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/