Android,ArrayAdapter的add()函数不工作

Android,ArrayAdapter的add()函数不工作,android,Android,我有一个ArrayAdapter(myAdapter)连接到AutoCompleteTextView(textView)组件。 一旦用户按下一个字符,我想用包含该字符的项目填充AutoCompleteTextView的下拉列表。 我使用AsyncTask(使用web服务)检索项目 我调用myAdapter.add(项),但下拉列表为空。 我在每次添加之后都添加了一个调用myAdapter.getCount(),每次都显示为零。 调用notifyDataSetChanged()没有帮助。 我甚至尝

我有一个ArrayAdapter(myAdapter)连接到AutoCompleteTextView(textView)组件。
一旦用户按下一个字符,我想用包含该字符的项目填充AutoCompleteTextView的下拉列表。
我使用AsyncTask(使用web服务)检索项目

我调用myAdapter.add(项),但下拉列表为空。
我在每次添加之后都添加了一个调用myAdapter.getCount(),每次都显示为零。 调用notifyDataSetChanged()没有帮助。
我甚至尝试添加简单的字符串对象而不是自定义对象,但都没有成功。
我做错了什么

编辑:我按照miette下面的建议更改了代码,但仍然无效。
通常,我所做的是在自动完成文本视图中更改文本后,调用新的AsyncTask并将输入的文本和处理程序传递给它(请参阅afterTextChanged()。该任务检索与文本相关的对象,完成后调用处理程序的handleMessage()。在handleMessage()中,我尝试填充适配器的对象。但是适配器的下拉列表仍然是空的

这是我的密码:

public class AddStockView extends Activity
        implements OnClickListener, OnItemClickListener, TextWatcher {  

    ArrayAdapter<Stock> adapter;
    AutoCompleteTextView textView;
    Vector<Stock> stocks;
    public AddStockView() {
      // TODO Auto-generated constructor stub
      stocks = new Vector<Stock>();
    }

    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      requestWindowFeature(Window.FEATURE_NO_TITLE); 
      setContentView(R.layout.add_stock_view);

      findViewById(R.id.abort_button).setOnClickListener(this);

      adapter = new ArrayAdapter<Stock>(this,
      android.R.layout.simple_dropdown_item_1line, stocks);
      //adapter.setNotifyOnChange(true);
      textView = (AutoCompleteTextView)
      findViewById(R.id.search_edit_text);
      textView.setAdapter(adapter);
      textView.setOnItemClickListener(this);
      textView.addTextChangedListener(this);

    }
    @Override
    public void onClick(View v) {
      // TODO Auto-generated method stub
      switch (v.getId())
      {
        case R.id.abort_button:
        finish();
        break;
        case R.id.search_edit_text:

        break;
      }
    }
    @Override
    public void onItemClick(AdapterView<?> parent, View v,
                            int position, long id) {
      // TODO Auto-generated method stub
      Stock stockToAdd = (Stock)parent.getAdapter().getItem(position);
      //TODO: Add the above stock to user's stocks and close this screen
      finish();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {  
      super.onCreateOptionsMenu(menu);  
      getMenuInflater().inflate(R.layout.menu, menu);  

      CategoryMenu.getInstance().populateMenu(menu);
      return true;  
    }  

    @Override  
    public boolean onOptionsItemSelected(MenuItem item) {  
      CategoryMenu.getInstance().menuItemSelected(item, this);
      return false; 
    }  

    @Override  
    public boolean onPrepareOptionsMenu(Menu menu) { 
      return true;  
    }
    @Override
    public void afterTextChanged(Editable text) {
      // TODO Auto-generated method stub
      if (text.toString().equals(""))
        return;
      new AppTask().execute(new AppTask.Payload(Consts.taskType.SEARCH_STOCK,
                                          new Object[] {text, handler}, this));

    }
    @Override
    public void beforeTextChanged(CharSequence a0, int a1, int a2, int a3) {
      // TODO Auto-generated method stub
    }
    @Override
    public void onTextChanged(CharSequence a0, int a1, int a2, int a3) {
      // TODO Auto-generated method stub
    }
    private void addStockItemsToAdapter(Vector<Object> dataItems)
    {
      for (int i = 0; i <dataItems.size(); i++)
      {
        Stock stk = (Stock)dataItems.elementAt(i);
        stocks.add(stk);
      }
    }

    public void populateAdapter()
    {
      addStockItemsToAdapter(ContentReader.getInstance.getDataItems());    
      adapter.notifyDataSetChanged();
      int size = adapter.getCount(); // size == 0 STILL!!!!
      textView.showDropDown();
    }
    final Handler handler = new Handler() {
      public void handleMessage(Message msg) {
        populateAdapter();
      }
    };
}
公共类AddStockView扩展活动
实现OnClickListener、OnItemClickListener、TextWatcher{
阵列适配器;
自动完成文本视图文本视图;
媒介种群;
公共AddStockView(){
//TODO自动生成的构造函数存根
股票=新向量();
}
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(窗口。功能\u无\u标题);
setContentView(R.layout.add_stock_视图);
findviewbyd(R.id.abort_按钮);
适配器=新阵列适配器(此,
android.R.layout.simple_下拉列表_项目_1行,股票);
//adapter.setNotifyOnChange(true);
文本视图=(自动完成文本视图)
findViewById(R.id.search\u edit\u text);
setAdapter(适配器);
setOnItemClickListener(这个);
textView.addTextChangedListener(此);
}
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
开关(v.getId())
{
案例R.id.abort_按钮:
完成();
打破
案例R.id.search\u edit\u文本:
打破
}
}
@凌驾
public void onItemClick(AdapterView父视图、视图v、,
内部位置,长id){
//TODO自动生成的方法存根
Stock stockToAdd=(Stock)parent.getAdapter().getItem(position);
//TODO:将上述库存添加到用户库存并关闭此屏幕
完成();
}
@凌驾
公共布尔onCreateOptions菜单(菜单菜单){
super.onCreateOptions菜单(菜单);
getMenuInflater().充气(R.layout.menu,menu);
CategoryMenu.getInstance().populateMenu(菜单);
返回true;
}  
@凌驾
公共布尔值onOptionsItemSelected(MenuItem项){
CategoryMenu.getInstance().menuItemSelected(项,此项);
返回false;
}  
@凌驾
公共布尔值OnPrepareOptions菜单(菜单){
返回true;
}
@凌驾
公共无效后文本更改(可编辑文本){
//TODO自动生成的方法存根
if(text.toString().equals(“”)
返回;
新建AppTask().execute(新建AppTask.Payload(Consts.taskType.SEARCH_STOCK,
新对象[]{text,handler},this));
}
@凌驾
文本更改前的公共无效(字符序列a0、int a1、int a2、int a3){
//TODO自动生成的方法存根
}
@凌驾
公共void onTextChanged(字符序列a0、int a1、int a2、int a3){
//TODO自动生成的方法存根
}
私有void addStockItemsToAdapter(向量数据项)
{

对于(inti=0;i在哪里调用addItemsToAdapter()? 您能告诉我们,您是如何尝试向适配器添加简单字符串的吗

编辑:从注释中选择有用的代码示例:

adapter = new ArrayAdapter<Stock>(this, android.R.layout.simple_dropdown_item_1line, stocks);
adapter.notifyDataSetChanged();
textView.setAdapter(adapter);
adapter=newarrayadapter(这是android.R.layout.simple\u下拉列表\u item\u 1line,stocks);
adapter.notifyDataSetChanged();
setAdapter(适配器);

使用向量或数组创建数组适配器,如:

ArrayAdapter(Context context, int textViewResourceId, T[] objects)
通过初始化arrayadapter,您将使其侦听对象数组。不要将项添加到适配器或清除适配器,请在“对象”数组中进行添加并将其清除。更改此数组后,调用

adapter.notifyDataSetChanged();
更具体地说

ArrayAdapter<YourContentType> yourAdapter = new ArrayAdapter<YourContentType> (this,R.id.OneOfYourTextViews,YourDataList);

yourAdapter.notifyDataSetChanged();    
aTextView.setText(yourAdapter.isEmpty() ? "List is empty" : "I have too many objects:)");
ArrayAdapter yourAdapter=new ArrayAdapter(这是一个R.id.oneofyourTextView,YourDataList);
yourAdapter.notifyDataSetChanged();
aTextView.setText(yourAdapter.isEmpty()?“列表为空”:“我有太多对象:)”;
这应该在加载数据列表后完成,我检查了您的代码,在查看适配器之前,您确定处理程序调用了
addStockItemsToAdapter()

您还应该检查stocks vector中是否有任何元素。

我遇到了完全相同的问题。在检查ArrayAdapter和AutoCompleteTextView源代码后,我发现问题简而言之是:

  • 原始对象列表存储在
    ArrayAdapter.mObjects
  • 但是,
    AutoCompleteTextView
    启用
    ArrayAdapter
    的过滤,这意味着新对象将添加到
    ArrayAdapter.moriginalvalvalue
    ,而
    mObjects
    包含过滤对象
  • ArrayAdapter.getCount()
    始终返回
    mObjects
    的大小
我的解决方案是重写
ArrayAdapter.getFilter()
以返回一个非过滤过滤器。这样
mOriginalValues
就是
null
,并且在所有情况下都使用
mObjects

示例代码:

public class MyAdapter extends ArrayAdapter<String> {
    NoFilter noFilter;
    /*
    ...
    */

    /**
     * Override ArrayAdapter.getFilter() to return our own filtering.
     */
    public Filter getFilter() {
        if (noFilter == null) {
            noFilter = new NoFilter();
        }
        return noFilter;
    }

    /**
     * Class which does not perform any filtering.
     * Filtering is already done by the web service when asking for the list,
     * so there is no need to do any more as well.
     * This way, ArrayAdapter.mOriginalValues is not used when calling e.g.
     * ArrayAdapter.add(), but instead ArrayAdapter.mObjects is updated directly
     * and methods like getCount() return the expected result.
     */
    private class NoFilter extends Filter {
        protected FilterResults performFiltering(CharSequence prefix) {
            return new FilterResults();
        }

        protected void publishResults(CharSequence constraint,
                                      FilterResults results) {
            // Do nothing
        }
    }
}
公共类MyAdapter扩展了ArrayAdapter{
无过滤器无过滤器;
/*
...
*/
/**
*覆盖阵列适配器.g