0

i want to build a Presense System with firebase but when i click join in toolbar, the app was forced stop.

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.app.PresenseSystem.User

ListUsersActivity

public class ListUsersActivity extends AppCompatActivity {

DatabaseReference onlineRef, currentUserRef, counterRef;
private FirebaseFirestore firebaseFirestore;
FirebaseRecyclerAdapter<User, ListViewHolder> adapter;

RecyclerView ListOnline;

RecyclerView.LayoutManager layoutManager;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list_users);

    ListOnline = (RecyclerView) findViewById(R.id.online_list);
    ListOnline.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(this);
    ListOnline.setLayoutManager(layoutManager);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setTitle("User lists");
    setSupportActionBar(toolbar);
    onlineRef = FirebaseDatabase.getInstance().getReference().child(".info/connected");
    counterRef = FirebaseDatabase.getInstance().getReference("lastOnline");
    currentUserRef = FirebaseDatabase.getInstance().getReference("lastOnline").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
    Query QueryRef = counterRef.orderByKey();

    setupSystem();

    FirebaseRecyclerOptions Options = new FirebaseRecyclerOptions.Builder<User>().setQuery(QueryRef, User.class).build();

    adapter = new FirebaseRecyclerAdapter<User, ListViewHolder>(Options) {
        @Override
        protected void onBindViewHolder(ListViewHolder holder, final int position, final User model) {
            holder.setName(model.getEmail());


        }
        @Override
        public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.user_lists, parent, false);

            return new ListViewHolder(view);
        }
    };
    adapter.notifyDataSetChanged();
    ListOnline.setAdapter(adapter);


}



private void setupSystem() {

    onlineRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.getValue(Boolean.class)) {
                currentUserRef.onDisconnect().removeValue();
                counterRef.child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                        .setValue(new User(FirebaseAuth.getInstance().getCurrentUser().getEmail(), "Online"));
                adapter.notifyDataSetChanged();


            }


        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    counterRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for(DataSnapshot postSnapshot:dataSnapshot.getChildren())
            {
                User user= postSnapshot.getValue(User.class);
                Log.d("LOG",""+user.getEmail()+"is"+user.getStatus());


            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.main_menu,menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case R.id.action_join:
            counterRef.child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                    .setValue(FirebaseAuth.getInstance().getCurrentUser().getEmail(),"Online");
            break;
        case R.id.action_logout:
            currentUserRef.removeValue();

    }
    return super.onOptionsItemSelected(item);
}

User

public class User {

public String name;
public String image;
public String email;
public String status;
public String userId;

public User(String email, String online) {

}

public User(String name, String image, String status, String email,String userid) {
    this.name = name;
    this.image = image;
    this.status = status;
    this.email= email;
    this.userId=userid;

}

public String getUserId() {
    return userId;
}

public void setUserId(String userId) {
    this.userId = userId;
}

public String getEmail() {
    return email;
}

public String getStatus() {
    return status;
}
public String getName() {
    return name;
}

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

public String getImage() {
    return image;
}

public void setImage(String image) {
    this.image = image;
}}

ListViewHolder

public class ListViewHolder extends RecyclerView.ViewHolder {

private TextView UserName;
View mView;

public ListViewHolder(View itemView){
    super(itemView);
    mView = itemView;
}
public void setName(String Name){
    TextView email = (TextView)mView.findViewById(R.id.text_email);
    email.setText(Name);
}}
OneCricketeer
  • 179,855
  • 19
  • 132
  • 245
Erik
  • 3
  • 4
  • Firebase requires you to have an empty `User()` constuctor, by the way – OneCricketeer Mar 25 '18 at 20:05
  • [This](https://stackoverflow.com/questions/49383687/how-can-i-retrieve-data-from-firebase-to-my-adapter/49384849) is how you can display data from Firebase Realtime database in a RecyclerView using a FirebaseRecyclerAdapter. – Alex Mamo Mar 26 '18 at 14:23

1 Answers1

0

Please Change this

 counterRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

        // Here
        for(DataSnapshot postSnapshot:dataSnapshot.getChildren())
        {
            User user= postSnapshot.getValue(User.class);
            Log.d("LOG",""+user.getEmail()+"is"+user.getStatus());
        }

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
}

into

 counterRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        User user= postSnapshot.getValue(User.class);
        Log.d("LOG",""+user.getEmail()+"is"+user.getStatus());
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

}

and make sure that your User.class variables names and types matches the one on your firebase database

OneCricketeer
  • 179,855
  • 19
  • 132
  • 245
Constantin N.
  • 2,739
  • 2
  • 16
  • 27