我正在尝试通过另一个微调器中的选定项更新微调器。以下代码块描述了我是如何做到的。
我可以使用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
}
}
}
以下是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>
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>
我刚刚发现了我的问题。
在原始代码中:
spinner3.setAdapter(adapter3);
在onItemSelectedListener
内调用。当适配器设置为AdapterView
时,适配器上的第一项将自动选择一次。所以,它会再次触发听众。
由于我没有设置标志来区分选择是否来自spinner2并放入spinner3.setAdapter(adapter3)
,因此它将继续运行“在adapter3上选择第一项 - &gt;检查所选项目是否为5“循环。
因此,在原始代码中插入以下标志对我有用:
if (parent.getId()==2131165201){
//code to check selected item and define new adapter3 for spinner3
答案 0 :(得分:2)
我建议你使用onItemclickListener返回的位置,并在为该微调器初始化数组适配器的数组中使用它:like ---
`
String hrs[]=getStringArray(R.array.departure_timeH6M_list);
if(hrs[pos].equals("5"))
{
}
`
依旧......
答案 1 :(得分:0)
当Spinner更改时,将数据放入下一个微调器的适配器内。刚写下adapter.notifyDataSetChanged();
下一个微调器内的内容将会改变。
答案 2 :(得分:0)
如果我正确理解你的问题,微调器默认选择一个值。如果微调器设置为适配器,它将是正确的,它将选择第一个值。你必须在onItemselectedListener中编写简单的hack来清除默认选择。 取一个int变量= -1 在我的代码中它是年龄限制 我选择一个布尔值年龄来查找默认选择。 if(ageselected)表示用户选择的微调器。
最后使用ageSpinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
class MyOnItemSelectedListener implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent,
View view, int pos, long id) {
if(ageposition==-1)
{
ageselected=false;
ageposition=pos;
}
else
{
ageposition=pos;
ageselected=true;
childage=age[pos];
}
}
public void onNothingSelected(AdapterView<?> parent) {
// Dummy
}
}
希望以上代码可以帮助您