java - ArrayList IndexOfBound 从firestore数据库获取数据时出现异常,为什么?
问题描述
我有一个 Recycler 视图,其中填充了 2 个 arraylist,第一个是卡片视图标题,第二个是它的内容,问题发生在第二个 arraylist 中,例如,它从 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 跳转for 2(因为 1 还没有填写)出错。
解决方案
快速解决方法是在索引 2 和 3 中添加数据之前检查 ArrayList 的大小。如果尚未收到来自数据库的数据,您可以:
- 等待,然后当数据到达时将其添加到索引 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
推荐阅读
- c - C语言游戏的while循环?
- .net-core - ConfigureWebHostDefaults 和 ConfigureWebHost 方法有什么区别?
- html - 标签不可点击且未链接
- html - CSS覆盖定位问题
- javascript - 如何在 chrome 扩展程序中重新定向到谷歌搜索?
- excel - 从包含 CSV 文件的文件夹中筛选 Power Query 中的多个条件的方法
- vuejs2 - vue-router 在 url 中返回 'function%20%' 而不是 param
- python - 调用随机值以绘制形状和删除形状
- sql - 时态表以一种奇怪的模式检索具有不同顺序的分区行集
- python - 类型错误:不支持的操作数