java - ArrayList IndexOfBound从firestore数据库获取数据时出现异常,为什么?

标签 java android android-recyclerview

我有一个 Recycler View,其中填充了 2 个数组列表,第一个是卡片 View 标题,第二个是其内容,问题发生在第二个数组列表中,例如,它从 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设置为null,然后添加2和3并继续,当数据到达时它将替换null值
  • 第二个选项的示例:

    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
    

    关于java - ArrayList IndexOfBound从firestore数据库获取数据时出现异常,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60215634/

    相关文章:

    java - keySet().toArray(new Double[0]) 是做什么的?

    android - Eclipse 不会自动生成 R.java 文件

    java - 如何在绘制之前获取调整大小的自定义 View 的宽度和高度

    android - 如何将位图覆盖在另一个位图上

    android - 如何在 Android 上创建半可拖动的回收 View ?

    android - 使textview在recyclerView中展开

    android - RecyclerView 无触摸反馈

    java - 在子类中隐藏方法

    java - jOOQ 3.9 : "ORA-00918: column ambiguously defined" on joined tables with matching column names

    java - 如何使用 Java(Fx) 从自定义 UI 面板创建/操作数据库和表?