Java 无法使用RecyclerAdapter将对象转换为字符串值
我试图在我的Android应用程序Java 无法使用RecyclerAdapter将对象转换为字符串值,java,android,firebase,firebase-realtime-database,android-recyclerview,Java,Android,Firebase,Firebase Realtime Database,Android Recyclerview,我试图在我的Android应用程序Fragment中显示Firebase实时数据库中的所有用户,该应用程序名为RequestFragment。但是,应用程序没有显示任何内容,我在日志中看到的错误是: 无法将用户对象转换为字符串值 有人可以检查下面的代码,让我知道什么可能是一个问题吗 下面的代码包括Fragmentclass、ViewHolderclass、Userclass、布局xml和应用程序渐变文件。我正在使用SDK 28,并将我的三星galaxy A6(2017)手机作为设备 public
Fragment
中显示Firebase实时数据库中的所有用户,该应用程序名为RequestFragment
。但是,应用程序没有显示任何内容,我在日志中看到的错误是:
无法将用户对象转换为字符串值
有人可以检查下面的代码,让我知道什么可能是一个问题吗
下面的代码包括Fragment
class、ViewHolder
class、User
class、布局xml和应用程序渐变文件。我正在使用SDK 28,并将我的三星galaxy A6(2017)手机作为设备
public class RequestsFragment extends Fragment {
private View UsersView;
private RecyclerView myUsersList;
//private DatabaseReference UsersRef;
private DatabaseReference mDatabase;
private FirebaseAuth mAuth;
private String currentUserID;
private FirebaseDatabase database;
public RequestsFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
FirebaseUser current_user = FirebaseAuth.getInstance().getCurrentUser();
String uid = current_user.getUid();
mDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(uid).push();
UsersView = inflater.inflate(R.layout.fragment_requests, container, false);
myUsersList = UsersView.findViewById(R.id.users_list);
myUsersList.setLayoutManager(new LinearLayoutManager(getContext()));
return UsersView;
}
@Override
public void onStart() {
super.onStart();
FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder<Users>()
.setQuery(mDatabase, Users.class)
.build();
FirebaseRecyclerAdapter<Users, UserViewHolder> adapter = new FirebaseRecyclerAdapter<Users, UserViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull final UserViewHolder holder, int position, @NonNull Users model) {
mDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChild("image"))
{
String userImage = dataSnapshot.child("image").getValue().toString();
String profileName = dataSnapshot.child("name").getValue().toString();
String profileStatus = dataSnapshot.child("status").getValue().toString();
holder.userName.setText(profileName);
holder.userStatus.setText(profileStatus);
Picasso.with(getContext()).load(userImage).placeholder(R.drawable.default_avatar).into(holder.profileImage);
}
else{
String profileName = dataSnapshot.child("name").getValue().toString();
String profileStatus = dataSnapshot.child("status").getValue().toString();
holder.userName.setText(profileName);
holder.userStatus.setText(profileStatus);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
@NonNull
@Override
public UserViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.users_single_layout, viewGroup,false);
UserViewHolder viewHolder = new UserViewHolder(view);
return viewHolder;
}
};
myUsersList.setAdapter(adapter);
adapter.startListening();
}
public static class UserViewHolder extends RecyclerView.ViewHolder
{
TextView userName, userStatus;
CircleImageView profileImage;
public UserViewHolder(@NonNull View itemView){
super(itemView);
userName = itemView.findViewById(R.id.user_single_name);
userStatus = itemView.findViewById(R.id.user_single_status);
profileImage = itemView.findViewById(R.id.user_single_image);
}
}
}
}
//users\u single\u layout.xml文件
//Gradle应用程序文件
应用插件:“com.android.application”
安卓{
编译DK28版
默认配置{
applicationId“com.xyx”
明斯克版本24
targetSdkVersion 28
版本代码1
版本名称“1.0”
TestInstrumentRunner“android.support.test.runner.AndroidJUnitRunner”
}
建筑类型{
释放{
minifyEnabled false
proguard文件GetDefaultProGuard文件('proguard-android-optimize.txt'),'proguard rules.pro'
}
}
包装选项{
排除“META-INF/许可证”
排除“META-INF/LICENSE-FIREBASE.txt”
排除“META-INF/通知”
}
}
依赖关系{
实现文件树(包括:['*.jar'],目录:“libs”)
实现'com.android.support:appcompat-v7:28.0.0'
实现'com.android.support:design:28.0.0'
实现'com.android.support.constraint:constraint布局:1.1.3'
实现'com.android.support:support-v4:28.0.0'
测试实现'junit:junit:4.12'
androidTestImplementation'com.android.support.test:runner:1.0.2'
androidTestImplementation'com.android.support.test.espresso:espresso核心:3.0.2'
实现'com.google.firebase:firebase核心:16.0.8'
实现'com.google.firebase:firebase存储:16.1.0'
实现'com.google.firebase:firebase auth:16.2.1'
实现'com.firebase:firebase客户端android:2.4.0'
实现'com.google.firebase:firebase数据库:16.1.0'
//画廊图片
实现'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor'com.github.bumptech.glide:compiler:4.9.0'
实现'com.android.support:cardview-v7:28.0.0'
实现'com.android.support:recyclerview-v7:28.0.0'
实现“de.hdodenhof:circleimageview:2.1.0”
实现'com.theartofdev.edmodo:android图像裁剪器:2.4.+'
实现“id.zelory:compressor:2.0.0”
实现'com.squareup.picasso:picasso:2.5.2'
实现'com.squareup.okhttp:okhttp:2.5.0'
//https://github.com/firebase/FirebaseUI-Android
//Firebase实时数据库的FirebaseUI
实现'com.firebaseui:firebaseui数据库:4.3.2'
//用于云Firestore的FirebaseUI
实现'com.firebaseui:firebaseui firestore:4.3.2'
//Firebase身份验证的Firebase用户界面
实现'com.firebaseui:firebaseui auth:4.3.2'
//Firebase身份验证的FirebaseUI(GitHub提供程序)
实现'com.firebaseui:firebaseui auth github:4.3.2'
//用于云存储的FirebaseUI
实现'com.firebaseui:firebaseui存储:4.3.2'
//实现'com.google.firebase:firebase分析:16.4.0'
实现'com.google.android.gms:play services auth:16.0.1'
//实现'com.google.android.gms:play服务库:jar:12.0.1'
//实现'com.google.android.gms:play services:12.0.1'
实现'com.google.firebase:firebase消息:17.6.0'
}
应用插件:“com.google.gms.googleservices”
您的布局是空的,因为您没有在onCreateView()方法中为片段扩展布局
添加此行:-
UsersView = inflater.inflate(R.layout.fragment_layout,container,false);
如果您的dataSnapshot引用的是模态类对象,请尝试检索您的值,如:-
Users post = dataSnapshot.getValue(Users.class);
String profileName = post.getName();
此答案更详细地介绍了firebase引用或如何在firebase数据库中设置子引用。您将遇到以下错误:
无法将用户对象转换为字符串值
因为您的mDatabase
指向一个字符串,而不是指向包含User
对象的节点:
mDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(uid).push();
还请注意,每次调用push()
方法时,都会生成一个新的随机键,并且该引用肯定无法传递给FirebaseRecyclerOptions
对象
要解决这个问题,您需要传递一个查询,该查询可以返回User
对象和not字符串。您需要传递的查询应该是:
mDatabase = FirebaseDatabase.getInstance().getReference().child("Users");
因为在用户
节点下只存在用户对象。很好,但不幸的是,我的代码中有这些对象,但在提交问题时意外编辑了它们。我已经把它包含在我的代码里了,你能再看一下吗。很多人感谢你的帮助!更新了我的答案,希望这能解决你的问题。嗨,萨加尔!你试过我上面的方法吗?如果你认为我的答案对你有帮助,请考虑通过点击复选来接受它。✔️) 在投票箭头的左边。应该换成绿色。我会很感激的。谢谢!
mDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(uid).push();
mDatabase = FirebaseDatabase.getInstance().getReference().child("Users");