Ben Ajax
Ben Ajax

Reputation: 740

Retrieving data from firebase database into recycler view

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

Answers (1)

Frank van Puffelen
Frank van Puffelen

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

Related Questions