【问题标题】:Android using One Spinner with Two AdaptersAndroid 使用一个 Spinner 和两个适配器
【发布时间】:2014-01-25 17:51:42
【问题描述】:

我有one spinner, two adapters and two buttons

当第一个按钮被点击时,maleAdapter 被调用 当单击另一个按钮时,会调用 femaleAdapter。 到目前为止,这很完美。

现在。我的问题是当每个适配器被调用时,显然会调用两个不同的数组,但我希望它们做不同的事情。

Spinner spinner;
String[] maleItems = { "item 1", "item 2", "item 3" };
String[] femaleItems = { "item 3", "item 2", "item 1", "item 0" };

Button maleButton;
Button femaleButton;

ArrayAdapter<String> maleAdapter;
ArrayAdapter<String> femaleAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

     final ArrayAdapter<String> maleAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, maleItems);
     final ArrayAdapter<String> femaleAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, femaleItems);

    spinner = (Spinner) findViewById(R.id.spinner1);
    spinner.setAdapter(maleAdapter);
    spinner.setOnItemSelectedListener(this);

    // Buttons
    maleButton = (Button) findViewById(R.id.maleButton);
    femaleButton = (Button) findViewById(R.id.femaleButton);

    maleButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            spinner.setAdapter(maleAdapter);

        }
    });

    femaleButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            spinner.setAdapter(femaleAdapter);

        }
    });

}

在我的 onItemSelected 上,我想根据按下的按钮更改发生的情况。

public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
        long arg3) {

int position = spinner.getSelectedItemPosition();
SpinnerAdapter adap = spinner.getAdapter();

if (adap.equals(maleAdapter)) {
    switch (position) {
    case 0:
        // do something only the maleAdapter does
        break;
    case 1:
        // do something only the maleAdapter does
        break;
    case 2:
        // do something only the maleAdapter does
        break;
    }
} else if (adap.equals(femaleAdapter)) {
    switch (position) {
    case 0:
        // do something only the femaleAdapter does
        break;
    case 1:
        // do something only the femaleAdapter does
        break;
    case 2:
        // do something only the femaleAdapter does
        break;
    }
}
}

我的 onClick 方法运行良好,但适配器更改给我一个错误,我不知道为什么。

错误

01-25 04:11:18.873: E/AndroidRuntime(21871): FATAL EXCEPTION: main
01-25 04:11:18.873: E/AndroidRuntime(21871): java.lang.NullPointerException
01-25 04:11:18.873: E/AndroidRuntime(21871):    at com.MainActivity.onItemSelected(MainActivity.java:117)
01-25 04:11:18.873: E/AndroidRuntime(21871):    at android.widget.AdapterView.fireOnSelected(AdapterView.java:871)
01-25 04:11:18.873: E/AndroidRuntime(21871):    at android.widget.AdapterView.access$200(AdapterView.java:42)
01-25 04:11:18.873: E/AndroidRuntime(21871):    at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:837)
01-25 04:11:18.873: E/AndroidRuntime(21871):    at android.os.Handler.handleCallback(Handler.java:587)
01-25 04:11:18.873: E/AndroidRuntime(21871):    at android.os.Handler.dispatchMessage(Handler.java:92)
01-25 04:11:18.873: E/AndroidRuntime(21871):    at android.os.Looper.loop(Looper.java:130)
01-25 04:11:18.873: E/AndroidRuntime(21871):    at android.app.ActivityThread.main(ActivityThread.java:3691)
01-25 04:11:18.873: E/AndroidRuntime(21871):    at java.lang.reflect.Method.invokeNative(Native Method)
01-25 04:11:18.873: E/AndroidRuntime(21871):    at java.lang.reflect.Method.invoke(Method.java:507)
01-25 04:11:18.873: E/AndroidRuntime(21871):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
01-25 04:11:18.873: E/AndroidRuntime(21871):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670)
01-25 04:11:18.873: E/AndroidRuntime(21871):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: java android spinner adapter android-spinner


    【解决方案1】:
    final ArrayAdapter<String> maleAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, maleItems); 
    

    它在onCreate的本地范围内删除它并在那里初始化全局maleAdpter

    只需在maleAdapter 和femaleAdapter 之前删除最终的ArrayAdapter。

    【讨论】:

    • 哇,我不敢相信它是如此简单,我做到了,它成功了....我把它们留在了 oncreate 中,并从一开始就取下了最终的 ArrayAdapter 并且它有效.
    【解决方案2】:

    我建议保留两个独立的OnItemSelectedListeners,每个适配器一个。现在,当您交换适配器时,也要交换OnItemSelectedListener。简单明了。

    【讨论】:

    • 当适配器发生变化时,如何将适配器设置为每个 OnItemSelectedListener?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多