2015-09-09 2 views
1

Я использую ту же строку array для заполнения данных в две блесны, как это:Populate Spinner на основе ArrayIndexOutOfBoundsException Выбор

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 затем показать September как начальное значение в spinner2 (А также удалить все previous months в spinner2).

В Точно так же, если я выбрал октября в spinner1, а затем начать 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(); 
      } 

UPDATE - Как было предложено @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 
+1

попробуйте установить 'spinner2.setSelection ((позицию + 1)% 12);' – Rustam

+0

вы просто хотите, чтобы показать выбор или хотят, чтобы удалить предыдущими месяцев? – Amy

+0

@Amy Я также хочу удалить предыдущие месячные элементы, разместить ваше решение – Oreo

ответ

1

Проблема в коде в этих строках:

newArr = new String[arrayMonths.length]; 
System.arraycopy(arrayMonths, position, newArr, 0, arrayMonths.length); 

Вы должны определить размер массива, как arrayMonths.length - (selected_position + 1).

Кроме того, проверьте Подпись метода ArrayCopy:

Src: исходный массив, чтобы скопировать содержимое.

srcPos: начальный индекс содержимого в src.

dst: целевой массив для копирования данных.

dstPos: начальный индекс для скопированного содержимого в dst.

длина: количество элементов для копирования.

Итак, вам необходимо изменить длину элементов, которые будут скопированы в arrayMonths.length-selected_position.

Фрагмент код

int nextPosition = position + 1; 
int newSize= arrayMonths.length-nextPosition ; 
newArr = new String[newSize]; 
System.arraycopy(arrayMonths, nextPosition , newArr, 0, newSize); 

Надеется, что это поможет вам ツ

+0

Можете ли вы показать мне свой последний код? –

+0

привет, мне нужно небольшое изменение, я не хочу показывать декабрь в spinner1 и январь в spinner2 .. – Oreo

+0

, когда вы не хотите показывать? –

0

Да, вы можете сделать это: В вашем Spinner1's onItemSelected метода вы можете написать, как показано ниже

spinner2.setSelection(position+1); 

здесь вы убедитесь, что, если index последняя будет бросать IndexOutOfBoundExcecption так справиться с этим.

0

На вашем 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); 
       } 
      } 
     } 
+0

Я проверил ваше решение, но я также хочу удалить элемент предыдущего месяца в spinner2 – Oreo

+0

, как при выборе элементов на spinner 2 вы также измените месяц на spinner 1? ех. Если я выбираю январь на spinner 1, то spinner 2 станет февраль, и когда я выберу марш на spinner2, тогда spinner 1 станет февраль? – MetaSnarf

+0

Ой, я понял. Подождите. я отредактирую свой ответ. – MetaSnarf

1

OnItemSelect Скопируйте ваши месяцев массив от выбранного постион на последнюю позицию в новом массиве. И установить, что новый массив SND 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(); 
        } 
+0

checked, получение: java.lang.ArrayIndexOutOfBoundsException: src.length = 12 srcPos = 0 dst.length = 0 dstPos = 0 length = 12 – Oreo

+0

Это правильный ответ. – MetaSnarf

+1

спасибо MetaSnarf – Amy

0

попробовать это:

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) { 

      } 
     });