Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList IndexOfBound异常何时从firestore数据库获取数据,为什么?_Java_Android_Android Recyclerview - Fatal编程技术网

Java ArrayList IndexOfBound异常何时从firestore数据库获取数据,为什么?

Java ArrayList IndexOfBound异常何时从firestore数据库获取数据,为什么?,java,android,android-recyclerview,Java,Android,Android Recyclerview,我有一个Recycler视图,其中填充了2个arraylist,第一个是卡片视图标题,第二个是其内容,问题发生在第二个arraylist中,例如,它从firestore接收数据 下面是如何填充从本地云和字符串接收的数据的arraylist的代码 valorCard.add(0,“R$:16.402,98”);//必须添加到第一个位置 DocumentReference dbRef=db.collection(“Usuarios”).document(firebaseAuth.getCurrent

我有一个Recycler视图,其中填充了2个arraylist,第一个是卡片视图标题,第二个是其内容,问题发生在第二个arraylist中,例如,它从firestore接收数据

下面是如何填充从本地云和字符串接收的数据的arraylist的代码

valorCard.add(0,“R$:16.402,98”);//必须添加到第一个位置
DocumentReference dbRef=db.collection(“Usuarios”).document(firebaseAuth.getCurrentUser().getUid().toString());
dbRef.get().addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时公共无效(文档快照文档快照){
valorCard.add(1,documentSnapshot.get(“quantBois”).toString();//必须添加到第二个位置
}
});
valorCard.加上(2,“25.000,00$”);//必须添加到第三个位置
valorCard.增补(3,“2020年5月25日”);//必须添加到第四个位置
运行代码时,将返回以下内容:

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)个位置,这会导致延迟,导致2的0跳转(因为1尚未填充)出错。

快速修复方法是在索引2和索引3中添加数据之前检查ArrayList的大小。如果尚未收到来自数据库的数据,您可以:

  • 等待,然后当数据到达时,在添加2和3之前将其添加到索引1中
  • 将索引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
    
    dbRef.get().addOnSuccessListener(新的OnSuccessListener()){
    @凌驾
    成功时公共无效(文档快照文档快照){
    valorCard.add(1,documentSnapshot.get(“quantBois”).toString();//必须添加到第二个位置
    }
    });
    如果(valorCard.size()==1){//请检查此处
    valorCard.add(空);
    }
    valorCard.加上(2,“25.000,00$”);//必须添加到第三个位置
    valorCard.增补(3,“2020年5月25日”);//必须添加到第四个位置
    
    快速修复方法是在索引2和索引3中添加数据之前检查ArrayList的大小。如果尚未收到来自数据库的数据,您可以:

  • 等待,然后当数据到达时,在添加2和3之前将其添加到索引1中
  • 将索引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
    
    dbRef.get().addOnSuccessListener(新的OnSuccessListener()){
    @凌驾
    成功时公共无效(文档快照文档快照){
    valorCard.add(1,documentSnapshot.get(“quantBois”).toString();//必须添加到第二个位置
    }
    });
    如果(valorCard.size()==1){//请检查此处
    valorCard.add(空);
    }
    valorCard.加上(2,“25.000,00$”);//必须添加到第三个位置
    valorCard.增补(3,“2020年5月25日”);//必须添加到第四个位置
    
    您得到此
    异常
    ,因为您的
    数组列表
    valorCard
    )大小为1,并且您正在位置2添加项目

    您可以通过如下方式在创建数组列表时设置数组列表大小来更正此问题:

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

    您得到此
    异常
    ,因为您的
    ArrayList
    valorCard
    )大小为1,并且您正在位置2添加项

    您可以通过如下方式在创建数组列表时设置数组列表大小来更正此问题:

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

    我的问题的原因是ArrayList中的一个方法“add”,这个方法覆盖position最早的值,并将其“put”放到下一个地址,解决方法是使用Set方法,然后是“valorCard.add”我将覆盖到valorCard.Set。

    我的问题的原因是ArrayList中的一个方法“add”,此方法覆盖最早的位置值并“放置”到下一个地址,解决方案是使用Set方法,然后是“valorCard.add”我将覆盖到valorCard.Set。

    我如何等待成为我的日期?我一定要用火把?你有灯吗?我怎么能等到我的生日呢?我一定要用手柄?你有灯吗?