Java 无法使用RecyclerView查看firebase中的单用户数据
期望的行为: 我试图在登录后显示Firebase中的单个用户“电子邮件”和“用户名”数据。目前,我的应用程序在登录时崩溃,logcat显示此错误: 无法将java.lang.String类型的对象转换为 com.example.start.model 注意:我使用intent.putExtra()从登录页面推送用户名 我的数据库快照: 主类:Java 无法使用RecyclerView查看firebase中的单用户数据,java,android,firebase,firebase-realtime-database,android-recyclerview,Java,Android,Firebase,Firebase Realtime Database,Android Recyclerview,期望的行为: 我试图在登录后显示Firebase中的单个用户“电子邮件”和“用户名”数据。目前,我的应用程序在登录时崩溃,logcat显示此错误: 无法将java.lang.String类型的对象转换为 com.example.start.model 注意:我使用intent.putExtra()从登录页面推送用户名 我的数据库快照: 主类: package com.example.start; import android.content.Intent; impo
package com.example.start;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
public class BeginStart extends AppCompatActivity {
DatabaseReference ref;
FirebaseDatabase rootNode;
private RecyclerView recyclerView;
String Receive_username;
private FirebaseRecyclerOptions<model> options;
private FirebaseRecyclerAdapter<model, MyViewHolder> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testlayout);
Intent intent = getIntent();
Receive_username = intent.getStringExtra("push_username");
rootNode = FirebaseDatabase.getInstance();
ref = rootNode.getReference("Users").child(Receive_username);
recyclerView =findViewById(R.id.testrecycle);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
options = new FirebaseRecyclerOptions.Builder<model>().setQuery(ref, model.class).build();
adapter = new FirebaseRecyclerAdapter<model, MyViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull MyViewHolder holder, int position, @NonNull model model) {
Toast.makeText(getApplicationContext(), "On Bind!", Toast.LENGTH_SHORT).show();
holder.textViewname.setText(model.getUsername());
holder.textViewemail.setText(model.getEmail());
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_view_layout,parent,false);
return new MyViewHolder(v);
}
};
adapter.startListening();
recyclerView.setAdapter(adapter);
}
}
package com.example.start;
public class model {
String username, email;
public model() {
}
public model(String username, String email) {
this.username = username;
this.email = email;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
package com.example.start;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
class MyViewHolder extends RecyclerView.ViewHolder {
TextView textViewname, textViewemail;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textViewname = itemView.findViewById(R.id.textviewname);
textViewemail = itemView.findViewById(R.id.textviewemail);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/testrecycle"
android:layout_marginRight="16dp"
android:layout_marginLeft="16dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</androidx.recyclerview.widget.RecyclerView>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textviewname"
android:text="title"
android:textSize="30dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textviewemail"
android:text="email"
android:textSize="30dp"/>
</LinearLayout>
查看处理程序类:
package com.example.start;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
public class BeginStart extends AppCompatActivity {
DatabaseReference ref;
FirebaseDatabase rootNode;
private RecyclerView recyclerView;
String Receive_username;
private FirebaseRecyclerOptions<model> options;
private FirebaseRecyclerAdapter<model, MyViewHolder> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testlayout);
Intent intent = getIntent();
Receive_username = intent.getStringExtra("push_username");
rootNode = FirebaseDatabase.getInstance();
ref = rootNode.getReference("Users").child(Receive_username);
recyclerView =findViewById(R.id.testrecycle);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
options = new FirebaseRecyclerOptions.Builder<model>().setQuery(ref, model.class).build();
adapter = new FirebaseRecyclerAdapter<model, MyViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull MyViewHolder holder, int position, @NonNull model model) {
Toast.makeText(getApplicationContext(), "On Bind!", Toast.LENGTH_SHORT).show();
holder.textViewname.setText(model.getUsername());
holder.textViewemail.setText(model.getEmail());
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_view_layout,parent,false);
return new MyViewHolder(v);
}
};
adapter.startListening();
recyclerView.setAdapter(adapter);
}
}
package com.example.start;
public class model {
String username, email;
public model() {
}
public model(String username, String email) {
this.username = username;
this.email = email;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
package com.example.start;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
class MyViewHolder extends RecyclerView.ViewHolder {
TextView textViewname, textViewemail;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textViewname = itemView.findViewById(R.id.textviewname);
textViewemail = itemView.findViewById(R.id.textviewemail);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/testrecycle"
android:layout_marginRight="16dp"
android:layout_marginLeft="16dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</androidx.recyclerview.widget.RecyclerView>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textviewname"
android:text="title"
android:textSize="30dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textviewemail"
android:text="email"
android:textSize="30dp"/>
</LinearLayout>
回收视图布局:
package com.example.start;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
public class BeginStart extends AppCompatActivity {
DatabaseReference ref;
FirebaseDatabase rootNode;
private RecyclerView recyclerView;
String Receive_username;
private FirebaseRecyclerOptions<model> options;
private FirebaseRecyclerAdapter<model, MyViewHolder> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testlayout);
Intent intent = getIntent();
Receive_username = intent.getStringExtra("push_username");
rootNode = FirebaseDatabase.getInstance();
ref = rootNode.getReference("Users").child(Receive_username);
recyclerView =findViewById(R.id.testrecycle);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
options = new FirebaseRecyclerOptions.Builder<model>().setQuery(ref, model.class).build();
adapter = new FirebaseRecyclerAdapter<model, MyViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull MyViewHolder holder, int position, @NonNull model model) {
Toast.makeText(getApplicationContext(), "On Bind!", Toast.LENGTH_SHORT).show();
holder.textViewname.setText(model.getUsername());
holder.textViewemail.setText(model.getEmail());
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_view_layout,parent,false);
return new MyViewHolder(v);
}
};
adapter.startListening();
recyclerView.setAdapter(adapter);
}
}
package com.example.start;
public class model {
String username, email;
public model() {
}
public model(String username, String email) {
this.username = username;
this.email = email;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
package com.example.start;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
class MyViewHolder extends RecyclerView.ViewHolder {
TextView textViewname, textViewemail;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textViewname = itemView.findViewById(R.id.textviewname);
textViewemail = itemView.findViewById(R.id.textviewemail);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/testrecycle"
android:layout_marginRight="16dp"
android:layout_marginLeft="16dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</androidx.recyclerview.widget.RecyclerView>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textviewname"
android:text="title"
android:textSize="30dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textviewemail"
android:text="email"
android:textSize="30dp"/>
</LinearLayout>
回收站视图的单视图布局:
package com.example.start;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
public class BeginStart extends AppCompatActivity {
DatabaseReference ref;
FirebaseDatabase rootNode;
private RecyclerView recyclerView;
String Receive_username;
private FirebaseRecyclerOptions<model> options;
private FirebaseRecyclerAdapter<model, MyViewHolder> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testlayout);
Intent intent = getIntent();
Receive_username = intent.getStringExtra("push_username");
rootNode = FirebaseDatabase.getInstance();
ref = rootNode.getReference("Users").child(Receive_username);
recyclerView =findViewById(R.id.testrecycle);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
options = new FirebaseRecyclerOptions.Builder<model>().setQuery(ref, model.class).build();
adapter = new FirebaseRecyclerAdapter<model, MyViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull MyViewHolder holder, int position, @NonNull model model) {
Toast.makeText(getApplicationContext(), "On Bind!", Toast.LENGTH_SHORT).show();
holder.textViewname.setText(model.getUsername());
holder.textViewemail.setText(model.getEmail());
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_view_layout,parent,false);
return new MyViewHolder(v);
}
};
adapter.startListening();
recyclerView.setAdapter(adapter);
}
}
package com.example.start;
public class model {
String username, email;
public model() {
}
public model(String username, String email) {
this.username = username;
this.email = email;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
package com.example.start;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
class MyViewHolder extends RecyclerView.ViewHolder {
TextView textViewname, textViewemail;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textViewname = itemView.findViewById(R.id.textviewname);
textViewemail = itemView.findViewById(R.id.textviewemail);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/testrecycle"
android:layout_marginRight="16dp"
android:layout_marginLeft="16dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</androidx.recyclerview.widget.RecyclerView>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textviewname"
android:text="title"
android:textSize="30dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textviewemail"
android:text="email"
android:textSize="30dp"/>
</LinearLayout>
当您通过以下参考时:
ref = rootNode.getReference("Users").child(Receive_username);
以及:
对于setQuery()
方法,这意味着您试图将Receive\u username
节点下存在的所有对象读取为model
类对象,这实际上是不可能的,因为在该节点下,只有字符串值,因此会出现错误
我试图在登录后显示firebase中的单个用户“电子邮件”和“用户名”数据
如果您只需要阅读单个用户的“电子邮件”和“用户名”,则根本不需要使用Firebase UI库。例如,当您需要在RecyclerView中显示users
节点中的所有用户时,将使用此库
如果只需要显示与单个用户对应的属性值,请使用以下代码行:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userRef = rootRef.child("Users").child(Receive_username);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String email = dataSnapshot.child("email").getValue(String.class);
String username = dataSnapshot.child("username").getValue(String.class);
Log.d("TAG", email + "/" + username);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
}
};
userRef.addListenerForSingleValueEvent(valueEventListener);
如果您的Receive\u username
变量包含Jim
的值,则logcat中的结果将是:
jim@test.com/Jim
谢谢,这帮助我更好地理解了使用数据库的工作,并进一步改进了我的项目。