Я разрабатываю 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 после его создания, поэтому я не уверен, что приведет к попытке получить доступ к этому индексу. Однако длина является ожидаемой длиной моего списка. Что может быть причиной этого?
Я думаю, вы найдете ответ на свой вопрос здесь: Http: // StackOverflow. com/questions/18917267/display-other-data-based-on-spinner-selection «Я пытался установить Adapter на spinner вне потока ui. После переноса связанного кода внутри runOnUiThread проблема решена». – Einar
Спасибо, что решил мою проблему. Я пытался проверить возможные дубликаты, прежде чем отправлять свой вопрос, но я не видел этого. – user3726962
Мне пришлось самому копаться :-) – Einar