[英]Retrieve data from firebase to android studio as listview
[英]Retrieve Firebase Data and Display in ListView in Android Studio
我目前正在構建一個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;
}
}
您正在收到該錯誤,因為您缺少一個孩子。 要解決此問題,請更改以下代碼行:
String value = dataSnapshot.getValue(String.class);
至
String value = dataSnapshot.child("Name").getValue(String.class);
登錄日志中的輸出將是所有客戶端的名稱。
PS還應注意,在項目中還會遇到其他錯誤,因為Client
類中字段的名稱全部為小寫,而數據庫中的字段名稱均以大寫字母開頭。 名稱應相同。 也請在這里看看。
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; }
}
創建POJO
類ArrayList
並將其添加到列表中,檢查以下代碼
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) {
}
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.