Reputation: 740
I just started working with firebase real time databases and i have been trying to retrieve data from firebase real time database into recycler view
but i am experiencing difficulties.
RecyclerViewAdapter
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
final String date_path = arrayList.get(position).getDate();
final String verse_path = arrayList.get(position).getVerse();
final String link_path = arrayList.get(position).getLink();
holder.date.setText(date_path);
holder.verse.setText(verse_path);
holder.setItemClickListener(new ItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Intent intent = new Intent(activity, AudioPlayerActivity.class);
activity.startActivity(intent);
}
@Override
public int getItemCount() {
return arrayList.size();
}
MainActivity.java
mDatabase = FirebaseDatabase.getInstance().getReference("Global");
mDatabase.keepSynced(true);
mRecyclerView = findViewById(R.id.main_recyclerview);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
ArrayList<Sermon> arrayList = (ArrayList<Sermon>) dataSnapshot.getValue();
mainRecyclerAdapter = new MainRecyclerAdapter(arrayList, MainActivity.this);
mRecyclerView.setAdapter(mainRecyclerAdapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {
String error = databaseError.toString();
Toast.makeText(MainActivity.this, "Error : " + error, Toast.LENGTH_LONG).show();
}
});
Error:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.bnotion.blogapp, PID: 6616
java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.ArrayList
at com.example.bnotion.blogapp.MainActivity$1.onDataChange(MainActivity.java:56)
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:836)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6251)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
Upvotes: 0
Views: 713
Reputation: 600006
Firebase nodes are a combination of a key and a value. This means that reading the node leads to a Map<String, Sermon>
and not to a List<Sermon>
.
You'll need to loop over the children of the DataSnapshot
and get the sermon from each in turn:
public void onDataChange(DataSnapshot dataSnapshot) {
ArrayList<Sermon> sermons = new ArrayList<>();
for (DataSnapshot sermon: dataSnapshot.getChildren()) {
sermons.add(sermon.getValue(Sermon.class));
}
mainRecyclerAdapter = new MainRecyclerAdapter(arrayList, MainActivity.this);
mRecyclerView.setAdapter(mainRecyclerAdapter);
}
Upvotes: 1