ArrayList IndexOfBound исключения, когда получать данные из базы данных Firestore, почему? - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть Recycler View, который заполнен 2-мя массивами, во-первых, это заголовок представления карты, а во-вторых, его содержимое, проблема возникает во втором массиве, который получает данные, например, из магазина.

Ниже приведен код для заполнения массива данных, которые я получаю из локального облака и строк.

        valorCard.add(0, "R$: 16.402,98"); // must be added on first position

        DocumentReference dbRef = db.collection("Usuarios").document(firebaseAuth.getCurrentUser().getUid().toString());
        dbRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>(){
            @Override
            public void onSuccess(DocumentSnapshot documentSnapshot) {
                valorCard.add(1, documentSnapshot.get("quantBois").toString()); // must be added on second position
            }
        });
        valorCard.add(2,"25.000,00$"); // must be added on thrid position
        valorCard.add(3,"25/05/2020"); // must be added on fourth position

Когда код выполняется, возвращается:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.agrolucros2019, PID: 29318
    java.lang.IndexOutOfBoundsException: Index: 2, Size: 1
        at java.util.ArrayList.add(ArrayList.java:483)
        at com.example.agrolucros2019.fragmentos.home.HomeFragment.onCreateView(HomeFragment.java:65)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
        at androidx.fragment.app.FragmentManagerImpl.addAddedFragments(FragmentManagerImpl.java:2100)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1874)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1830)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
        at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2663)
        at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManagerImpl.java:2613)
        at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2624)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:904)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2659)
        at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManagerImpl.java:2613)
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:246)
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:542)
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1395)
        at android.app.Activity.performStart(Activity.java:7361)
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3150)
        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1960)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7094)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)

Я полагаю, что это связано с тем, что запрос данных в облаке занимает некоторое время для получения данных, и, поскольку мне нужно вставить данные точно во вторую (1) позицию, это вызывает задержку, которая вызывает 0 прыжок на 2 (так как 1 еще не был заполнен) go неправильно.

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

вы получаете это exception, потому что ваш ArrayList (valorCard) размер равен 1, и вы добавляете элемент в позиции 2

, вы можете исправить это, установив размер списка массива при его создании следующим образом. :

ArrayList<String> valorCard = ArrayList<>(4);

, но значения, которые не установлены, будут null для предотвращения null. Вы можете использовать этот код при создании valorCard:

ArrayList<String> valorCard = ArrayList<>();
valorCard.addAll( { "", "", "", "" } );// four strings for size of 4
1 голос
/ 13 февраля 2020

Быстрое решение состоит в проверке размера ArrayList перед добавлением данных в индексы 2 и 3. Если данные из базы данных не были получены, вы можете:

  1. Подождите, а затем, когда данные поступят, добавьте их в индекс 1, прежде чем добавлять 2 и 3

ИЛИ

Установите для индекса 1 значение NULL, а затем добавьте 2 и 3 и продолжайте. После получения данных он заменит нулевое значение

Пример 2-го варианта:

dbRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>(){
            @Override
            public void onSuccess(DocumentSnapshot documentSnapshot) {
                valorCard.add(1, documentSnapshot.get("quantBois").toString()); // must be added on second position
            }
        });
        if (valorCard.size() == 1){ // Check here
            valorCard.add(null);
        }
        valorCard.add(2,"25.000,00$"); // must be added on thrid position
        valorCard.add(3,"25/05/2020"); // must be added on fourth position
0 голосов
/ 14 февраля 2020

Причиной моей проблемы является метод «add» из ArrayList, этот метод перезаписывает самое старое значение позиции и «put» по следующему адресу, решением было использование метода Set, поэтому , затем были "valorCard.add", я перезаписал на valorCard.set.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...