【问题标题】:Retrieve Firebase Data and Display in ListView in Android Studio在 Android Studio 的 ListView 中检索 Firebase 数据并显示
【发布时间】:2018-09-04 23:38:51
【问题描述】:

我目前正在构建一个 Android 应用程序并使用 Firebase 作为其后端数据库,但是我无法检索数据并将它们显示在 ListView 中。我尝试了一些代码,但应用程序在我显示列表活动时立即崩溃。

下面是我的数据库的屏幕截图,还有我的代码以及我尝试运行时遇到的错误:

Firebase 数据库

public class ClientLIstActivity extends AppCompatActivity {

private Button clientSelect;
private ListView clientlistView;
private FirebaseDatabase database;
private DatabaseReference databaseReference;

private ArrayList<String> list = new ArrayList<String>();
private ArrayAdapter<String> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_client_list);

    clientlistView = (ListView) findViewById(R.id.clientListView);
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,list);
    clientlistView.setAdapter(adapter);
    adapter.notifyDataSetChanged();
    databaseReference = FirebaseDatabase.getInstance().getReference().child("Clients");


    clientSelect = (Button) findViewById(R.id.selectClient);

    clientSelect.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onBackPressed();
        }
    });

    databaseReference.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
           String value = dataSnapshot.getValue(String.class);
           list.add(value);
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}


}

错误日志:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.javytharanee.quicksolattendance, PID: 6602
              com.google.firebase.database.DatabaseException: Failed to convert value of type java.util.HashMap to String
                  at com.google.android.gms.internal.zzepg.zzb(Unknown Source:93)
                  at com.google.android.gms.internal.zzepg.zza(Unknown Source:0)
                  at com.google.firebase.database.DataSnapshot.getValue(Unknown Source:10)
                  at com.javytharanee.quicksolattendance.ClientLIstActivity$2.onChildAdded(ClientLIstActivity.java:53)
                  at com.google.android.gms.internal.zzegg.zza(Unknown Source:71)
                  at com.google.android.gms.internal.zzelk.zzcal(Unknown Source:2)
                  at com.google.android.gms.internal.zzelq.run(Unknown Source:71)
                  at android.os.Handler.handleCallback(Handler.java:873)
                  at android.os.Handler.dispatchMessage(Handler.java:99)
                  at android.os.Looper.loop(Looper.java:193)
                  at android.app.ActivityThread.main(ActivityThread.java:6669)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

客户端对象类:

public class Client {
String name;
String location;
String latitude;
String longitude;

public Client(String location, String latitude, String longitude) {
    this.location = location;
    this.latitude = latitude;
    this.longitude = longitude;
}

public Map toMap() {
    Map client = new HashMap();

    client.put("Name", this.name);
    client.put("Location", this.location);
    client.put("Latitude", this.latitude);
    client.put("Longitude", this.longitude);

    return client;
}

public void setName(String name) {
    this.name = name;
}
}

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    您收到该错误,因为您缺少一个孩子。要解决这个问题,请更改以下代码行:

    String value = dataSnapshot.getValue(String.class);
    

    String value = dataSnapshot.child("Name").getValue(String.class);
    

    logat 中的输出将是所有客户端的名称。

    P.S. 另外请注意,您将在项目中遇到其他错误,因为您的 Client 类中的字段名称都是小写的,而在您的数据库中都以大写字母开头。名称应该相同。也请看看here

    public class Client {
        private String name, location, latitude, longitude;
    
        public Client() {}
    
        public Client(String name, String location, String latitude, String longitude) {
            this.name = name;
            this.location = location;
            this.latitude = latitude;
            this.longitude = longitude;
        }
    
        public String getName() { return name; }
        public String getLocation() { return location; }
        public String getLatitude() { return latitude; }
        public String getLongitude() { return longitude; }
    }
    

    【讨论】:

    • 再次感谢您的回答,但即使将字段名称更改为大写,它也不会显示任何内容。它只显示搜索和按钮
    • 因为吸气剂。您应该保持您的课程不变,并从数据库中删除旧数据并添加新数据。是这样的吗?
    • 请在我更新的答案中查看您的模型类的外观。
    • 我尝试删除数据并添加新数据,但没有成功。如果我将我的课程更改为这个课程,我会在其他课程中出错
    • 它如何用新数据显示您的数据库?你得到什么错误?还有哪些类?
    【解决方案2】:

    创建POJOArrayList 并将其添加到您的列表中,检查下面的代码

        public class ClientLIstActivity extends AppCompatActivity {
    
    private Button clientSelect;
    private ListView clientlistView;
    private FirebaseDatabase database;
    private DatabaseReference databaseReference;
    
    private ArrayList<Client> list = new ArrayList>(); // 1=change here
    private ArrayAdapter<String> adapter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_client_list);
    
        clientlistView = (ListView) findViewById(R.id.clientListView);
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,list);
        clientlistView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        databaseReference = FirebaseDatabase.getInstance().getReference().child("Clients");
    
    
        clientSelect = (Button) findViewById(R.id.selectClient);
    
        clientSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onBackPressed();
            }
        });
    
        databaseReference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
               Client value = dataSnapshot.getValue(Client.class);  // 2=change here
               list.add(value);
            }
    
            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
    
            }
    
            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {
    
            }
    
            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {
    
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
    
            }
        });
    }
    
    
    }
    

    【讨论】:

    • 此处出现错误:adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1,list);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 2019-01-12
    • 2021-11-12
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多