Reputation: 41
I am currently building an Android app and using Firebase as its backend database, however i'm having difficulties to retrieve the data and display them in a ListView
. I tried few codes but the app is crashing as soon as i display the list activity.
Below is a screenshot of my database and also my code and the error I get when I try to run:
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);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,list);
clientlistView.setAdapter(adapter);
adapter.notifyDataSetChanged();
databaseReference = FirebaseDatabase.getInstance().getReference().child("Clients");
clientlistView = (ListView) findViewById(R.id.clientListView);
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) {
}
});
}
}
Error Log:
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)
Upvotes: 2
Views: 4125
Reputation: 533
Firstly you need to initialize the clientlistView and the you have to set the listview to the adapter,
In your programm you are setting the adapter view without initializing the clientlistview
you need to write your code like this
clientListView = findViewById(R.id.your_listView_id);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,list);
clientlistView.setAdapter(adapter);
Upvotes: 0
Reputation: 789
You missed create the instance of your listview clientListView = findViewById(R.id.your_listView_id);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_client_list);
clientListView = findViewById(R.id.your_listView_id);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,list);
clientlistView.setAdapter(adapter);
adapter.notifyDataSetChanged();
databaseReference = FirebaseDatabase.getInstance().getReference().child("Clients");
....
Upvotes: 1
Reputation: 138824
To solve this, just move the following line of code:
clientlistView = (ListView) findViewById(R.id.clientListView);
right before this line:
clientlistView.setAdapter(adapter);
You first need to instantiate the ListView
object before actually using it.
Upvotes: 1