2016-12-04 5 views
0

Я разрабатываю Android-приложение с активностью, которая загружает данные из DynamoDB в Spinner. Я поставил Spinner по телефону employeeSpinner = (Spinner)findViewById(R.id.employeeSpinner); и я установил его адаптер и данные по загрузке списка из DynamoDB так:Android IndexOutOfBounds Ошибка на Spinner

final Context context = this; 
    AsyncHandler<ScanRequest, ScanResult> asyncHandler = new AsyncHandler<ScanRequest, ScanResult>() { 
     public void onError(Exception exception) { 
      showDialogMessageAsync("Error", "Error scanning table: " + exception.getMessage()); 
     } 

     @Override 
     public void onSuccess(ScanRequest request, ScanResult result) { 
      for (Map<String, AttributeValue> data : result.getItems()) { 
       ConcurrentHashMap hashData = new ConcurrentHashMap<>(data); 
       String orgName = (hashData.get(DynamoDBManager.ORGANIZATION_NAME)).toString(); 
       String employeeName = (hashData.get(DynamoDBManager.EMPLOYEE_NAME)).toString(); 
       Employee e = new Employee(orgName, employeeName); 
       employeeList.add(e); 
      } 
      ArrayList<String> employeeNames = new ArrayList<>(); 
      int length = employeeList.size(); 
      for(int i = 0; i < length; i++){ 
       String name = employeeList.get(i).getEmployeeName(); 
       employeeNames.add(name); 
      } 
      ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item, employeeNames); 
      dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
      employeeSpinner.setAdapter(dataAdapter); 
     } 
    }; 
    HashMap<String, AttributeValue> attributeValues = new HashMap<>(); 
    attributeValues.put(":orgName", new AttributeValue().withS(getOrgName())); 
    String filterExpression = "organization_name = :orgName"; 
    DynamoDBManager.scan(asyncClient, DynamoDBManager.EMPLOYEE_TABLE, filterExpression, attributeValues, asyncHandler); 

Вот трассировки стека от аварии, которая происходит после того, как вертушка создается:

java.lang.ArrayIndexOutOfBoundsException: length=15; index=-1 
        at java.util.ArrayList.get(ArrayList.java:413) 
        at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:349) 
        at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:405) 
        at android.widget.ArrayAdapter.getView(ArrayAdapter.java:371) 
        at android.widget.Spinner.makeView(Spinner.java:702) 
        at android.widget.Spinner.layout(Spinner.java:650) 
        at android.widget.Spinner.onLayout(Spinner.java:612) 
        at android.view.View.layout(View.java:17523) 
        at android.view.ViewGroup.layout(ViewGroup.java:5612) 
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079) 
        at android.view.View.layout(View.java:17523) 
        at android.view.ViewGroup.layout(ViewGroup.java:5612) 
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
        at android.view.View.layout(View.java:17523) 
        at android.view.ViewGroup.layout(ViewGroup.java:5612) 
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741) 
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585) 
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1494) 
        at android.view.View.layout(View.java:17523) 
        at android.view.ViewGroup.layout(ViewGroup.java:5612) 
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
        at android.view.View.layout(View.java:17523) 
        at android.view.ViewGroup.layout(ViewGroup.java:5612) 
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741) 
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585) 
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1494) 
        at android.view.View.layout(View.java:17523) 
        at android.view.ViewGroup.layout(ViewGroup.java:5612) 
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261) 
        at com.android.internal.policy.DecorView.onLayout(DecorView.java:724) 
        at android.view.View.layout(View.java:17523) 
        at android.view.ViewGroup.layout(ViewGroup.java:5612) 
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2342) 
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2069) 
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246) 
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6301) 
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871) 
        at android.view.Choreographer.doCallbacks(Choreographer.java:683) 
        at android.view.Choreographer.doFrame(Choreographer.java:619) 
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857) 
        at android.os.Handler.handleCallback(Handler.java:751) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6077) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

То, что я нахожу особенно странным, это то, что он говорит index = -1, но я ничего не делаю с моим Spinner после его создания, поэтому я не уверен, что приведет к попытке получить доступ к этому индексу. Однако длина является ожидаемой длиной моего списка. Что может быть причиной этого?

+0

Я думаю, вы найдете ответ на свой вопрос здесь: Http: // StackOverflow. com/questions/18917267/display-other-data-based-on-spinner-selection «Я пытался установить Adapter на spinner вне потока ui. После переноса связанного кода внутри runOnUiThread проблема решена». – Einar

+0

Спасибо, что решил мою проблему. Я пытался проверить возможные дубликаты, прежде чем отправлять свой вопрос, но я не видел этого. – user3726962

+0

Мне пришлось самому копаться :-) – Einar

ответ

0

комментарий Эйнара решить мою проблему, все, что я должен был сделать обернуть свой код в runOnUiThread и аварии больше не произошло:

runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        employeeSpinner.setAdapter(dataAdapter); 
       } 
      }); 
Смежные вопросы