首页 > 解决方案 > 当 Firebase 包含列表时应用程序崩溃

问题描述

我有一个应用程序,它保存在 firebase 当前位置(城市名称等)、id 和一个带有点的列表中,这样我就可以保存折线。firebase 导入成功。问题是当我去另一个包含一个列表视图的活动时,应用程序崩溃了。我试图在没有 firebase 列表的情况下使它工作正常。因此,仅当 firebase 包含带有点的列表时,才存在问题。

这是我的火力基地的一个例子。在这里,“ola”是包含点的列表,我只在最后一个。如果我删除最后一个,应用程序可以正常工作。

在此处输入图像描述

import java.util.List;




public class Paths {
String id;
String name;
String city;
String nomos;
String perifereia;
List<Ola> ola;



public Paths(){

}



public Paths(String id, String name, String city, String nomos, String perifereia, List<Ola> ola) {
    this.id = id;
    this.name = name;
    this.city = city;
    this.nomos = nomos;
    this.perifereia = perifereia;
    this.ola = ola;

}

public String getId() {
    return id;
}

public String getName() {
    return name;
}

public String getCity() {
    return city;
}

public String getNomos() {
    return nomos;
}

public String getPerifereia() {
    return perifereia;
}

public List<Ola> getOla() {
    return ola;
}

.

public class Ola {

public double latitude;
public double longitude;


public Ola() {}


public Ola(double latitude, double longitude) {
    this.latitude = latitude;
    this.longitude = longitude;
}

public double getLatitude() {
    return latitude;
}

public void setLatitude(double latitude) {
    this.latitude = latitude;
}

public double getLongitude() {
    return longitude;
}

public void setLongitude(double longitude) {
    this.longitude = longitude;
}

}

这是错误:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.spiros.mypath, PID: 28814
              com.google.firebase.database.DatabaseException: Can't convert object of type java.util.ArrayList to type com.example.spiros.mypath.Ola
                  at com.google.android.gms.internal.firebase_database.zzkt.zzb(Unknown Source)
                  at com.google.android.gms.internal.firebase_database.zzkt.zza(Unknown Source)
                  at com.google.android.gms.internal.firebase_database.zzkt.zza(Unknown Source)
                  at com.google.android.gms.internal.firebase_database.zzkt.zzb(Unknown Source)
                  at com.google.android.gms.internal.firebase_database.zzku.zza(Unknown Source)
                  at com.google.android.gms.internal.firebase_database.zzkt.zzb(Unknown Source)
                  at com.google.android.gms.internal.firebase_database.zzkt.zza(Unknown Source)
                  at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
                  at com.example.spiros.mypath.CitiesList$1.onDataChange(CitiesList.java:44)
                  at com.google.android.gms.internal.firebase_database.zzfc.zza(Unknown Source)
                  at com.google.android.gms.internal.firebase_database.zzgx.zzdr(Unknown Source)
                  at com.google.android.gms.internal.firebase_database.zzhd.run(Unknown Source)
                  at android.os.Handler.handleCallback(Handler.java:761)
                  at android.os.Handler.dispatchMessage(Handler.java:98)
                  at android.os.Looper.loop(Looper.java:156)
                  at android.app.ActivityThread.main(ActivityThread.java:6595)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)

这就是从 firebase 接收数据的代码:

    databasePaths = FirebaseDatabase.getInstance().getReference("Paths");

    databasePaths.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            for (DataSnapshot items: dataSnapshot.getChildren())
            {
                info = items.getValue(Paths.class);
                ArrayListCities.add(info.city);

            }


            adapterCities = new ArrayAdapter<>(CitiesList.this, android.R.layout.simple_list_item_1, ArrayListCities);
            ListViewCities.setAdapter(adapterCities);
            adapterCities.notifyDataSetChanged();


            ListViewCities.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    String selectedFromListCities = (ListViewCities.getItemAtPosition(position).toString());



                    Intent IntentGoN = new Intent(getApplicationContext(), FullListByCity.class);
                    IntentGoN.putExtra("city", selectedFromListCities);
                    startActivity(IntentGoN);

                }
            });

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

标签: javaandroidfirebasefirebase-realtime-database

解决方案


这就是问题

Class java.util.List has generic type parameters, please use GenericTypeIndicator instead

List 需要被告知它持有什么样的对象。所以你需要创建一个可以接受变量的模型类ola

首先确保您的 Firebase 数据库结构是

key-|
---city
---....
---ola|
-------0|
---------latitude
---------longitude
-------1|
---------...

然后使用构造函数为 ola 创建一个模型类,其中包含两个对象(纬度和经度)

现在您可以将列表用作

List<Ola> ola;

推荐阅读