java.lang.IndexOutOfBoundsException错误不知道如何解决

时间:2019-09-30 06:27:08

标签: android firebase google-maps firebase-realtime-database

我正在开发地图应用程序,但是当我尝试从Firebase提取latlng时,我一直收到此错误,我不理解并且也不知道如何解决。

错误:

  

java.lang.IndexOutOfBoundsException:无效的索引0,大小为0           在        java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)           在java.util.ArrayList.get(ArrayList.java:308)           在fr.divdev.maphadev.MapsActivity.initMarkers(MapsActivity.java:120)           在fr.divdev.maphadev.MapsActivity.onMapReady(MapsActivity.java:74)           位于com.google.android.gms.maps.zzak.zza(未知来源)           在         com.google.android.gms.maps.internal.zzaq.dispatchTransaction(未知        资源)           在com.google.android.gms.internal.maps.zzb.onTransact(未知        来源)

getLocationList()代码:

public List < Location > getLocationList() {
    final List < Location > list = new ArrayList < > ();
    DatabaseReference f_database = FirebaseDatabase.getInstance().getReference().child("location");
    f_database.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot child:
                dataSnapshot.child("Loisir").child("lieu").child("latlng").getChildren()) {
                double lat = Double.parseDouble(child.child("latitude").getValue().toString());
                double lng = Double.parseDouble(child.child("longitude").getValue().toString());
                list.add(new Location("location", new LatLng(lat, lng)));
                Log.e("erreur", "********");
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
    return list;
}

2 个答案:

答案 0 :(得分:0)

添加侦听器后,由于Firebase需要使用网络获取数据,因此该过程将花费一些时间。因此,您无法创建从远程计算机中的firebase db获取并希望其返回完整数据的函数。您可以做的是在getLocationList()

内的onDataChange()之后调用需要调用的函数
public void getLocationList() {
    DatabaseReference f_database = FirebaseDatabase.getInstance().getReference().child("location");
    f_database.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            List < Location > list = new ArrayList < > ();
            for (DataSnapshot child:
                dataSnapshot.child("Loisir").child("lieu").child("latlng").getChildren()) {
                double lat = Double.parseDouble(child.child("latitude").getValue().toString());
                double lng = Double.parseDouble(child.child("longitude").getValue().toString());
                list.add(new Location("location", new LatLng(lat, lng)));
                Log.e("erreur", "********");
            }
            someFunction(list);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}

或者您也可以尝试onComplete()onSuccess()等方法。

作为一个提示,与其以后监听"location"节点和childing,不如直接监听所需的节点本身。

DatabaseReference f_database = FirebaseDatabase.getInstance().getReference().child("location");

DatabaseReference f_database = FirebaseDatabase.getInstance().getReference().child("location").child("Loisir").child("lieu").child("latlng");

然后

for (DataSnapshot child: dataSnapshot.child("Loisir").child("lieu").child("latlng").getChildren()) {

for (DataSnapshot child: dataSnapshot.getChildren()) {
...
}

答案 1 :(得分:-1)

该函数返回的

list为空,因为firebase api调用是异步的,因此返回list;是在api可以获取数据之前执行的。

移动退货清单;在for循环之外的onDataChange函数中,那么您将拥有数据。现在,为了获取异步数据,请尝试使用asynctask或创建一个接口以返回数据。 希望这会有所帮助。