根据选择 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);

希望对你有帮助ツ