【问题标题】:Refresh ArrayAdapter dynamically动态刷新 ArrayAdapter
【发布时间】:2010-12-30 09:10:59
【问题描述】:

我有一个带有自动完成框的活动。每当文本更改时,我想调用 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,state。是否可以在自动下拉框中将城市和州放在第二行?仅用于格式化目的。如果可以的话会看起来更干净。

谢谢!

【问题讨论】:

    标签: android autocomplete


    【解决方案1】:

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

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

    【讨论】:

    • 今晚我将尝试在该方法中添加 true。如果这不起作用,我将尝试清除适配器,然后循环遍历字符串并单独添加元素(但我希望这不是解决方案)。但如果你是正确的,我会报告我的发现并接受。
    • 我将继续假设我需要 clear() 然后使用 add() 或 insert()。我将数据设置为字符串 []。但我将尝试将其全部作为 JSONArray 返回并循环执行。类似于:schools = SchoolProxy.search(s.toString()); for (int i = 0; i
    【解决方案2】:

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

    AutoCompleteTextView.showDropdown()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 2016-07-30
      • 1970-01-01
      • 2011-09-24
      • 2010-09-21
      相关资源
      最近更新 更多