簡體   English   中英

ArrayList IndexOfBound 異常何時從 Firestore 數據庫獲取數據,為什么?

[英]ArrayList IndexOfBound exceptions when to get data from firestore database, why?

我有一個 Recycler 視圖,其中填充了 2 個數組列表,第一個是卡片視圖標題,第二個是它的內容,問題發生在第二個數組列表中,例如,它從 Firestore 接收數據。

下面是我如何填充從本地雲和字符串接收到的數據數組列表的代碼。

        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 尚未填寫)出錯。

快速解決方法是在將數據添加到索引 2 和 3 之前檢查 ArrayList 的大小。如果尚未收到來自數據庫的數據,您可以:

  1. 等待,然后當數據到達時將其添加到索引1,然后添加2和3

或者

  1. 將索引1設置為空然后將2和3相加並繼續,當數據到達時將替換空值

第二種選擇的例子:

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

您會收到此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

我的問題的這個原因是 ArrayList 中的一個方法“add”,這個方法覆蓋了位置的最舊值並“放置”到下一個地址,解決方案是使用 Set 方法,所以,然后是“valorCard.add”我'm 覆蓋到 valorCard.set。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM