根据选择 ArrayIndexOutOfBoundsException 填充 Spinner
Populate Spinner based on Selection ArrayIndexOutOfBoundsException
我正在使用相同的字符串 array
将数据填充到 两个微调器 中,如下所示:
String[] arrayMonths = { "January", "Feburary", "March", "April", "May",
"June", "July", "August", "September", "October", "November","December" };
adapter = new ArrayAdapter<String>(MainActivity.this,
android.R.layout.simple_spinner_item, arrayMonths);
spinner1.setAdapter(adapter);
spinner2.setAdapter(adapter);
现在,我希望每当我在 spinner1 中进行选择时,就像我选择了 August
然后在 spinner2 中显示 September
作为初始值(以及 remove spinner2).
中的所有 previous months
以同样的方式,如果我在 spinner1
中选择了 October,那么从 November 开始 spinner2
spinner1.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(),
spinner1.getItemAtPosition(position).toString(), Toast.LENGTH_LONG)
.show();
}
更新- 正如@AMY
所建议的
public class MainActivity extends AppCompatActivity {
Spinner spinner1, spinner2;
ArrayAdapter<String> adapter;
String newArr[];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner1 = (Spinner) findViewById(R.id.spinner1);
spinner2 = (Spinner) findViewById(R.id.spinner2);
final String[] arrayMonths = { "January", "Feburary", "March", "April", "May",
"June", "July", "August", "September", "October", "November","December" };
newArr = new String[] {"January", "Feburary", "March", "April", "May",
"June", "July", "August", "September", "October", "November","December"};
adapter = new ArrayAdapter<String> (MainActivity.this,
android.R.layout.simple_spinner_item, arrayMonths);
spinner1.setAdapter(adapter);
spinner1.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(),
spinner1.getItemAtPosition(position).toString(), Toast.LENGTH_LONG)
.show();
newArr = new String[arrayMonths.length-1];
System.arraycopy(arrayMonths , position, newArr , 0, arrayMonths.length);
adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item, newArr);
spinner2.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
}
});
}
}
获取异常: ArrayIndexOutOfBoundsException
java.lang.ArrayIndexOutOfBoundsException: src.length=12 srcPos=0 dst.length=11 dstPos=0 length=12
是的,你可以这样做:
在您的 Spinner1's
onItemSelected 方法中,您可以像下面这样写
spinner2.setSelection(position+1);
在这里你要确保如果 index
是最后一个它会抛出一个 IndexOutOfBoundExcecption
所以处理它。
在你的 spinner1 上:
spinner1.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
if(position<arrayMonths.length-1){
spinner2.setSelection(position+1)
}
else{
//set spinner 2 selection to january if spinner1 selects december.
spinner2.setSelection(0);
}
}
}
OnItemSelect
将您的月份数组从所选位置复制到新数组中的最后一个位置。并将新数组设置为 std Spinner
spinner1.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
String[] newArr = new String[arrayMonths.length-1];
System.arraycopy(arrayMonths , position, newArr , 0, arrayMonths.length);
adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item, newArr);
spinner2.setAdapter(adapter);
spinner2.notifyDataSetChanged();
}
试试这个:
spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
spinner2.setSelection((position + 1) % 12);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if(position>0) {
spinner1.setSelection((position - 1) % 12);
}else{
spinner1.setSelection(11);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
这些行的代码中的问题:
newArr = new String[arrayMonths.length];
System.arraycopy(arrayMonths, position, newArr, 0, arrayMonths.length);
您需要将数组大小定义为arrayMonths.length - (selected_position+1).
此外,检查方法的签名 arraycopy :
src : the source array to copy the content.
srcPos : the starting
index of the content in src.
dst : the destination array to copy the data into.
dstPos : the starting index for the copied content in dst.
length : the number of elements to be copied.
因此,您需要将要复制的元素的长度更改为 arrayMonths.length-selected_position.
代码片段
int nextPosition = position + 1;
int newSize= arrayMonths.length-nextPosition ;
newArr = new String[newSize];
System.arraycopy(arrayMonths, nextPosition , newArr, 0, newSize);
希望对你有帮助ツ
我正在使用相同的字符串 array
将数据填充到 两个微调器 中,如下所示:
String[] arrayMonths = { "January", "Feburary", "March", "April", "May",
"June", "July", "August", "September", "October", "November","December" };
adapter = new ArrayAdapter<String>(MainActivity.this,
android.R.layout.simple_spinner_item, arrayMonths);
spinner1.setAdapter(adapter);
spinner2.setAdapter(adapter);
现在,我希望每当我在 spinner1 中进行选择时,就像我选择了 August
然后在 spinner2 中显示 September
作为初始值(以及 remove spinner2).
previous months
以同样的方式,如果我在 spinner1
中选择了 October,那么从 November 开始 spinner2
spinner1.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(),
spinner1.getItemAtPosition(position).toString(), Toast.LENGTH_LONG)
.show();
}
更新- 正如@AMY
所建议的 public class MainActivity extends AppCompatActivity {
Spinner spinner1, spinner2;
ArrayAdapter<String> adapter;
String newArr[];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner1 = (Spinner) findViewById(R.id.spinner1);
spinner2 = (Spinner) findViewById(R.id.spinner2);
final String[] arrayMonths = { "January", "Feburary", "March", "April", "May",
"June", "July", "August", "September", "October", "November","December" };
newArr = new String[] {"January", "Feburary", "March", "April", "May",
"June", "July", "August", "September", "October", "November","December"};
adapter = new ArrayAdapter<String> (MainActivity.this,
android.R.layout.simple_spinner_item, arrayMonths);
spinner1.setAdapter(adapter);
spinner1.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(),
spinner1.getItemAtPosition(position).toString(), Toast.LENGTH_LONG)
.show();
newArr = new String[arrayMonths.length-1];
System.arraycopy(arrayMonths , position, newArr , 0, arrayMonths.length);
adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item, newArr);
spinner2.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
}
});
}
}
获取异常: ArrayIndexOutOfBoundsException
java.lang.ArrayIndexOutOfBoundsException: src.length=12 srcPos=0 dst.length=11 dstPos=0 length=12
是的,你可以这样做:
在您的 Spinner1's
onItemSelected 方法中,您可以像下面这样写
spinner2.setSelection(position+1);
在这里你要确保如果 index
是最后一个它会抛出一个 IndexOutOfBoundExcecption
所以处理它。
在你的 spinner1 上:
spinner1.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
if(position<arrayMonths.length-1){
spinner2.setSelection(position+1)
}
else{
//set spinner 2 selection to january if spinner1 selects december.
spinner2.setSelection(0);
}
}
}
OnItemSelect
将您的月份数组从所选位置复制到新数组中的最后一个位置。并将新数组设置为 std Spinner
spinner1.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
String[] newArr = new String[arrayMonths.length-1];
System.arraycopy(arrayMonths , position, newArr , 0, arrayMonths.length);
adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item, newArr);
spinner2.setAdapter(adapter);
spinner2.notifyDataSetChanged();
}
试试这个:
spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
spinner2.setSelection((position + 1) % 12);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if(position>0) {
spinner1.setSelection((position - 1) % 12);
}else{
spinner1.setSelection(11);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
这些行的代码中的问题:
newArr = new String[arrayMonths.length];
System.arraycopy(arrayMonths, position, newArr, 0, arrayMonths.length);
您需要将数组大小定义为arrayMonths.length - (selected_position+1).
此外,检查方法的签名 arraycopy :
src : the source array to copy the content.
srcPos : the starting index of the content in src.
dst : the destination array to copy the data into.
dstPos : the starting index for the copied content in dst.
length : the number of elements to be copied.
因此,您需要将要复制的元素的长度更改为 arrayMonths.length-selected_position.
代码片段
int nextPosition = position + 1;
int newSize= arrayMonths.length-nextPosition ;
newArr = new String[newSize];
System.arraycopy(arrayMonths, nextPosition , newArr, 0, newSize);
希望对你有帮助ツ