I am trying to create a group activity in which all the groups to which the user is connected can be shown over this activity. I have created the group activity and insert the recycler view in it and tried to retrieve the data from the database but unfortunately, I am getting errors when I run my application on my android phone. the application gets crashed and in the logcat, I got the message says Can't convert an object of type java.lang.String to type com.nanb.alpha.modelclass. if you don't mind please help me so that I can complete my activity.
below code are the code where user can create a group.
private void groupmethos(final String groupname) {
DatabaseReference groupref = rootref.child("Group").push();
final String grouppushid = groupref.getKey();
Map groupmap = new HashMap<>();
groupmap.put("GroupprofileName",groupname);
groupmap.put("Creater",currentUser.getUid());
groupmap.put("StatusGroup","");
groupmap.put("profileimage","");
groupmap.put("id",grouppushid);
rootref.child("Group").child(grouppushid).updateChildren(groupmap).addOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
rootref.child("GroupMessage").child(grouppushid).setValue("").addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()){
rootref.child("userconnectedtogroup").child(currentUser.getUid()).child(grouppushid).setValue("Added").addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Toast.makeText(MainActivity.this,groupname + "group Created successfully",Toast.LENGTH_SHORT).show();
}
});
}
}
});
}
});
}
in the above codes, the user requests to create a group. given below are the codes where the data fetch from the database using getter and setter.
package com.nanb.alpha;
public class modelclass {
private String GroupprofileName,StatusGroup,profileimage;
public modelclass() {
}
public modelclass(String groupprofileName, String statusGroup, String profileimage) {
this.GroupprofileName = groupprofileName;
this.StatusGroup = statusGroup;
this.profileimage = profileimage;
}
public String getGroupprofileName() {
return GroupprofileName;
}
public void setGroupprofileName(String groupprofileName) {
GroupprofileName = groupprofileName;
}
public String getStatusGroup() {
return StatusGroup;
}
public void setStatusGroup(String statusGroup) {
StatusGroup = statusGroup;
}
public String getProfileimage() {
return profileimage;
}
public void setProfileimage(String profileimage) {
this.profileimage = profileimage;
}
}
given code is the code where recyclerview works to set the value to the layout given.
public class group extends AppCompatActivity {
private RecyclerView recyclerView;
private DatabaseReference conref,groupref;
private FirebaseAuth mAuth;
private String Currentuserid;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_group);
intialiation();
mAuth = FirebaseAuth.getInstance();
Currentuserid = mAuth.getCurrentUser().getUid();
conref = FirebaseDatabase.getInstance().getReference().child("userconnectedtogroup").child(Currentuserid);
groupref = FirebaseDatabase.getInstance().getReference().child("Group");
}
private void intialiation() {
recyclerView = findViewById(R.id.recyclerview);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
}
@Override
protected void onStart() {
super.onStart();
FirebaseRecyclerOptions option = new FirebaseRecyclerOptions.Builder<modelclass>().setQuery(conref,modelclass.class).build();
FirebaseRecyclerAdapter<modelclass,group_viewHolder> adapter = new FirebaseRecyclerAdapter<modelclass, group_viewHolder>(option) {
@Override
protected void onBindViewHolder(@NonNull final group_viewHolder group_viewHolder, int i, @NonNull modelclass modelclass) {
String userid = getRef(i).getKey();
groupref.child(userid).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.hasChild("profileimage")){
String profileimage = dataSnapshot.child("profileimage").getValue().toString();
String groupname = dataSnapshot.child("GroupprofileName").getValue().toString();
String groupStatus = dataSnapshot.child("StatusGroup").getValue().toString();
group_viewHolder.groupname.setText(groupname);
group_viewHolder.groupStatus.setText(groupStatus);
Picasso.get().load(profileimage).into(group_viewHolder.profileimage);
}else{
String groupname = dataSnapshot.child("GroupprofileName").getValue().toString();
String groupStatus = dataSnapshot.child("StatusGroup").getValue().toString();
group_viewHolder.groupname.setText(groupname);
group_viewHolder.groupStatus.setText(groupStatus);
Picasso.get().load(R.mipmap.groupicon).into(group_viewHolder.profileimage);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
@NonNull
@Override
public group_viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.grouplayout,parent,false);
group_viewHolder groupholder = new group_viewHolder(view);
return groupholder;
}
};
recyclerView.setAdapter(adapter);
adapter.startListening();
}
public static class group_viewHolder extends RecyclerView.ViewHolder{
TextView groupname,groupStatus;
CircleImageView profileimage;
public group_viewHolder(@NonNull View itemView) {
super(itemView);
groupname = itemView.findViewById(R.id.Group_name);
groupStatus = itemView.findViewById(R.id.Group_Status);
profileimage = itemView.findViewById(R.id.group_profile_dp);
}
}
}
given below is the image of my firebase database. Which shows all the structures related to group activity.
Below is the logcat message that is been shown after the application gets crashed.
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.nanb.alpha.modelclass at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(com.google.firebase:firebase-database@@19.1.0:418) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(com.google.firebase:firebase-database@@19.1.0:214) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(com.google.firebase:firebase-database@@19.1.0:79) at com.google.firebase.database.DataSnapshot.getValue(com.google.firebase:firebase-database@@19.1.0:203) at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:29) at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:15) at com.firebase.ui.common.BaseCachingSnapshotParser.parseSnapshot(BaseCachingSnapshotParser.java:35) at com.firebase.ui.common.BaseObservableSnapshotArray.get( BaseObservableSnapshotArray.java:52) at com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:106) at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:122) at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781) at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823) at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752) at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019) at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858) at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854) at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230) at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk( LinearLayoutManager.java:1557) at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517) at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612) at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924) at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641) at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4194) at android.view.View.layout(View.java:15689) at android.view.ViewGroup.layout(ViewGroup.java:5048) at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1915) at android.view.View.layout(View.java:15689) at android.view.ViewGroup.layout(ViewGroup.java:5048) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) at android.widget.FrameLayout.onLayout(FrameLayout.java:514) at android.view.View.layout(View.java:15689) at android.view.ViewGroup.layout(ViewGroup.java:5048) at android.widge t.LinearLayout.setChildFrame(LinearLayout.java:1703) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) at android.widget.LinearLayout.onLayout(LinearLayout.java:1466) at android.view.View.layout(View.java:15689) at android.view.ViewGroup.layout(ViewGroup.java:5048) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) at android.widget.FrameLayout.onLayout(FrameLayout.java:514) at android.view.View.layout(View.java:15689) at android.view.ViewGroup.layout(ViewGroup.java:5048) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) at android.widget.LinearLayout.onLayout(LinearLayout.java:1466) at android.view.View.layout(View.java:15689) at android.view.ViewGroup.layout(ViewGroup.java:5048) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) at android.widget.FrameLayout.onLayout(FrameLayout.java:514) at android
Your userconnectedtogroup
in database doesn't contain model, it contains string like Added . Update your query
like below:
FirebaseRecyclerOptions option = new FirebaseRecyclerOptions.Builder<String>().setQuery(conref,String.class).build();
FirebaseRecyclerAdapter<String,group_viewHolder> adapter = new FirebaseRecyclerAdapter<String, group_viewHolder>(option) {
@Override
protected void onBindViewHolder(@NonNull final group_viewHolder group_viewHolder, int i, @NonNull modelclass modelclass) {
String groupId = getRef(i).getKey();
groupref.child(groupId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.hasChild("profileimage")){
String profileimage = dataSnapshot.child("profileimage").getValue().toString();
String groupname = dataSnapshot.child("GroupprofileName").getValue().toString();
String groupStatus = dataSnapshot.child("StatusGroup").getValue().toString();
group_viewHolder.groupname.setText(groupname);
group_viewHolder.groupStatus.setText(groupStatus);
Picasso.get().load(profileimage).into(group_viewHolder.profileimage);
}else{
String groupname = dataSnapshot.child("GroupprofileName").getValue().toString();
String groupStatus = dataSnapshot.child("StatusGroup").getValue().toString();
group_viewHolder.groupname.setText(groupname);
group_viewHolder.groupStatus.setText(groupStatus);
Picasso.get().load(R.mipmap.groupicon).into(group_viewHolder.profileimage);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
@NonNull
@Override
public group_viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.grouplayout,parent,false);
group_viewHolder groupholder = new group_viewHolder(view);
return groupholder;
}
};
You can also use your model inside onDataChange
like below:
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
modelclass modelClass = dataSnapshot.getValue(modelclass.class);
if(!TextUtils.isEmpty(modelClass.getProfileimage())) {
group_viewHolder.groupname.setText(modelClass.getGroupprofileName());
group_viewHolder.groupStatus.setText(modelClass.getStatusGroup());
Picasso.get().load(modelClass.getProfileimage()).into(group_viewHolder.profileimage);
} else {
group_viewHolder.groupname.setText(modelClass.getGroupprofileName());
group_viewHolder.groupStatus.setText(modelClass.getStatusGroup());
Picasso.get().load(R.mipmap.groupicon).into(group_viewHolder.profileimage);
}
}
在选项对象中使用 groupref 代替 conref
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.