Search code examples
androidjsonandroid-recyclerviewfirebase-realtime-databasefirebaseui

FirebaseUI-Android RecyclerView Not Responding to POJO


My Android FirebaseUI Recycler view is responding well with String class datatype. But is not populating view when I use my POJO class as datatype.

I have taken time to ensure the names in my POJO matches the names in JSON file. Below are my codes:

public class MainActivity extends AppCompatActivity   {
    public static class MessageViewHolder extends RecyclerView.ViewHolder {
        TextView messageTextView;

        public   MessageViewHolder(View view) {
            super(view);
            messageTextView =(TextView) messageTextView.findViewById(android.R.id.text1);

        }

    }

    android.support.v7.widget.RecyclerView recyclerView;

    FirebaseDatabase  database = FirebaseDatabase.getInstance();

    DatabaseReference myRef = database.getReference();

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

    @Override
    protected void onStart()
    {
        super.onStart();
        //Recycler
        recyclerView=(android.support.v7.widget.RecyclerView)findViewById(R.id.recyclerview);

        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        //Adapter
             FirebaseRecyclerAdapter<User, MessageViewHolder> mFirebaseAdapter=
                new FirebaseRecyclerAdapter<User, MessageViewHolder>(User.class,
                        R.layout.layout,
                        MessageViewHolder.class,
                        myRef.child("User")
                ) {
                    @Override
                    protected void populateViewHolder(MessageViewHolder viewHolder, User model, int position) {

                        viewHolder.messageTextView.setText(model.getName());
                    }
                };


        recyclerView.setAdapter(mFirebaseAdapter);


    }
}

POJO:

public class User {

   public User(){

    }
    String Name;
    String email;
   public User(String Name){

        this.Name=Name;

    }

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

    public String getName() {
        return Name;
    }

}

Error From Firebase

Exception com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.projectgenuis.eneanews.User

EDIT(JSON)

 {
  "User" : {
    "Name" : "Zion",

  }

Solution

  • The FirebaseUI adapters are designed to show lists of items, in your case a list of users. In your current data model, there is only a single user under the /User node. That means there is no way to show it in a list view.

    The simplest way to fix this is to change your JSON to have a list of users under a Users node:

    {
      "Users" : {
        "User1": {
          "Name" : "Zion"
        }
        "User2": {
          "Name" : "puf"
        }
      }
    }
    

    And then attach the adapter to this collection:

    mFirebaseAdapter= new FirebaseRecyclerAdapter<User, MessageViewHolder>(
                        User.class,
                        R.layout.layout,
                        MessageViewHolder.class,
                        myRef.child("Users")
                ) {