我试图通过另一个微调器中的选定项更新微调器.以下代码块描述了我是如何做到的.
我可以使用onItemSelected()方法中的if语句成功更新spinner3.但我的问题是,似乎一个循环只是继续运行,它自动从spinner2中选择值"5" (所以Toast只是继续吐出"你选择了5").
加载活动后,Toast将显示所有三个微调器的每个选择.这是否意味着当适配器设置为微调器时,每个微调器的第一个选择是否完成?
将adapter3绑定到spinner3(在if语句中)是否会触发一个新的spinner2选择?
提前致谢!
public class WheelchairHelperMain extends Activity{
Spinner spinner2;
Spinner spinner3;
ArrayAdapter<CharSequence> adapter3 ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.wheelchair_helper_main);
Spinner spinner1 = (Spinner)findViewById(R.id.spinner1);
ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(this, R.array.destinations_list, android.R.layout.simple_spinner_item);
adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner1.setAdapter(adapter1);
spinner1.setOnItemSelectedListener(new MyOnItemSelectedListener());
spinner2 = (Spinner)findViewById(R.id.spinner2);
ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(this,R.array.departure_timeH_list,android.R.layout.simple_spinner_item);
adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner2.setAdapter(adapter2);
spinner2.setOnItemSelectedListener(new MyOnItemSelectedListener());
spinner3 = (Spinner)findViewById(R.id.spinner3);
spinner3.setOnItemSelectedListener(new MyOnItemSelectedListener());
}
public class MyOnItemSelectedListener implements OnItemSelectedListener{
public void onItemSelected(AdapterView<?> parent, View v, int pos,long id) {
// TODO Auto-generated method stub
//use the selected station and departure time to calculate the required time
Toast toast = Toast.makeText(parent.getContext(),"You've chosen? " + parent.getItemAtPosition(pos), 2);
toast.show();
if (spinner2.getSelectedItem().equals("5")){
adapter3 = ArrayAdapter.createFromResource(WheelchairHelperMain.this,R.array.departure_timeH5M_list, android.R.layout.simple_spinner_item);
adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner3.setAdapter(adapter3);
Log.v("spinner2","5");
}else if(spinner2.getSelectedItem().equals("6")){
adapter3 = ArrayAdapter.createFromResource(WheelchairHelperMain.this,R.array.departure_timeH6M_list, android.R.layout.simple_spinner_item);
adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner3.setAdapter(adapter3);
Log.v("spinner2","6");
}
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下是xml文件.这是spinner2的字符串数组:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="departure_timeH_prompt">???</string>
<string-array name="departure_timeH_list">
<item>5</item>
<item>6</item>
<item> 7 </item>
<item> 8 </item>
<item> 9 </item>
<item> 10 </item>
<item> 11 </item>
<item> 12 </item>
<item> 13 </item>
<item> 14 </item>
<item> 15 </item>
<item> 16 </item>
<item> 17 </item>
<item> 18 </item>
<item> 19 </item>
<item> 20 </item>
<item> 21 </item>
<item> 22 </item>
<item> 23 </item>
<item> 24 </item>
<item> 0 </item>
</string-array>
</resources>
Run Code Online (Sandbox Code Playgroud)
spinner3的字符串数组:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="departure_timeM_prompt">???</string>
<string-array name="departure_timeH5M_list">
<item> 5 </item>
<item> 24 </item>
<item> 38 </item>
<item> 52 </item>
</string-array>
<string-array name="departure_timeH6M_list">
<item> 01 </item>
<item> 08 </item>
<item> 17 </item>
<item> 25 </item>
<item> 34 </item>
<item> 41 </item>
<item> 47 </item>
<item> 57 </item>
</string-array>
</resources>
Run Code Online (Sandbox Code Playgroud)
我刚刚发现了我的问题.
在原始代码中:
spinner3.setAdapter(adapter3);
Run Code Online (Sandbox Code Playgroud)
被称为内部onItemSelectedListener.当适配器设置为a时AdapterView,适配器上的第一项将自动选择一次.所以,它会再次触发听众.
而且由于我没有设置标志来区分选择是否来自spinner2并且放入spinner3.setAdapter(adapter3),它将继续运行"在adapter3上选择第一项 - >检查所选项是否为5"循环.
因此,在原始代码中插入以下标志对我有用:
if (parent.getId()==2131165201){
//code to check selected item and define new adapter3 for spinner3
Run Code Online (Sandbox Code Playgroud)
当 Spinner 更改时,将数据放入下一个 Spinner 的适配器中。而刚刚写入的adapter.notifyDataSetChanged();下一个微调器内的内容将会改变。