【问题标题】:how to add item to Spinner's ArrayAdapter?如何将项目添加到 Spinner 的 ArrayAdapter?
【发布时间】:2010-03-24 03:45:03
【问题描述】:

我有一个 EditText 、一个 button 和一个 spinner 。单击按钮 时,微调器将添加一个新项目,名称为您在 EditText 中输入的名称。但问题是,我的 adapter.add() 方法似乎不起作用……这是我的代码:

public class Spr extends Activity {
Button bt1;
EditText et;
ArrayAdapter<CharSequence> adapter;
Spinner spinner;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    bt1 = (Button)this.findViewById(R.id.bt1);
    et = (EditText)this.findViewById(R.id.et);  
    spinner = (Spinner)this.findViewById(R.id.spr);

    adapter = ArrayAdapter.createFromResource(
            this, R.array.planets_array, android.R.layout.simple_spinner_item);

    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    spinner.setAdapter(adapter);

    bt1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            String temp = et.getText().toString();

            adapter.add(temp);
            adapter.notifyDataSetChanged();
            spinner.setAdapter(adapter);

        }
    });


    spinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){

        @Override
        public void onItemSelected(AdapterView<?> parent, View view,
                int pos, long id) {

            Toast.makeText(parent.getContext(), "The planet is " +
                      parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {

        }});
}

}

谢谢! ...还在等待中

【问题讨论】:

  • 您绝对不需要在 View.OnClickListener 中再次调用 spinner.setAdapter()。不过,您的代码看起来应该可以工作。
  • 您也无需致电notifyDataSetChanged()。只需adapter.add() 就足够了。当您说“不起作用”时,您是什么意思?
  • 我找到了答案,有人告诉我,再次调用 notifyDataSetChanged() 和 setAdapter() 可能会有帮助。所以我添加了它,但它仍然不起作用......当我运行它时,然后单击按钮。它会跳出一个错误:应用程序已意外停止。请重试...(我认为问题出在方法 spinner.add()。)谢谢您的帮助!
  • 如果您可以向我们展示 logcat 在您的应用程序崩溃时显示的异常,这将有所帮助。
  • 没有出现异常。我尝试:将项目放入 ArrayList al 中,然后 adapter = new ArrayAdapter(... , ... , al ) ... 然后它有效...我的问题是:它们之间有什么区别(我的意思是 ArrayAdapter.createFromResource() 方法和新的 ArrayAdapter())?我很抱歉我的英语很差,我希望你能明白我在说什么......非常感谢

标签: android add adapter android-arrayadapter


【解决方案1】:

当您创建 ArrayAdapter 时,您还没有为其分配可调整大小的 List,因此当您执行 add() 时,它无法增加它的大小并引发 UnsupportedOperationException。

试试这样的:

List<CharSequence> planets = new ArrayList<CharSequence>();
adapter = new ArrayAdapter<CharSequence>(context,
                       R.array.planets_array, planets);
//now you can call adapter.add()

您应该使用列表。使用 CharSequence[] 之类的数组,您将获得相同的 UnsupportedOperationException 异常。

【讨论】:

    【解决方案2】:

    Javi 是对的,只是第二个参数不引用数组。

    adapter = new ArrayAdapter<CharSequence>(this,
      android.R.layout.simple_spinner_item,
      someList);
    

    【讨论】:

      【解决方案3】:

      我相信这是按设计工作的,但并非按预期工作。 ArrayAdapter 以前只取一个数组,后来添加了列表构造函数。我猜它只是在你的列表上做一个 toArray() 。这就是为什么您必须在适配器上调用 add 或在 List 更改时创建新适配器的原因。

      【讨论】:

        【解决方案4】:

        您可以创建一个arraylist并将所有资源复制到该对象,然后创建arrayadaptor并发送此arraylist,然后在按钮的onclicklistener中,将edittext内容添加到arraylist对象,然后调用adator的notifydatasetchanged

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-18
          • 1970-01-01
          相关资源
          最近更新 更多