Java 创建新活动后如何显示RecyclerView,Android Firebase
当我的主页片段通过意图使用常规按钮转到新类时。在新类中,当我尝试使用Java 创建新活动后如何显示RecyclerView,Android Firebase,java,android,firebase,firebase-realtime-database,android-recyclerview,Java,Android,Firebase,Firebase Realtime Database,Android Recyclerview,当我的主页片段通过意图使用常规按钮转到新类时。在新类中,当我尝试使用RecylerVie和Firebase显示数据时,数据没有出现,应用程序崩溃 在我的Firebase上,节点从project-->转到DataHome-->Home1。 Home 1具有属性描述、方向、成分、图像和标题 DataHome还有其他名为Home2的节点,等等。但在本例中,我只尝试在这个类上显示来自Home1的数据 logcat显示致命异常Main:Process:com.google.firebase.databa
RecylerVie
和Firebase显示数据时,数据没有出现,应用程序崩溃
在我的Firebase上,节点从project-->转到DataHome-->Home1。
Home 1具有属性描述、方向、成分、图像和标题
DataHome还有其他名为Home2的节点,等等。但在本例中,我只尝试在这个类上显示来自Home1的数据
logcat显示致命异常Main:Process:com.google.firebase.database.DatabaseException:无法将java.lang.String类型的对象转换为com.example.tmrecipes.Model.DataHome类型 这是一节课:
public class BeefSamosa extends AppCompatActivity {
FirebaseDatabase mHomeFireBaseDatabase;
RecyclerView myhomeview;
private DatabaseReference DataHomeRef;
private LinearLayoutManager mLinearLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_beef_samosa);
//Back Button
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("Beef Samosa");
//Recycler View
myhomeview = findViewById(R.id.beefview);
myhomeview.setHasFixedSize(true);
//set layout as LinearLayout
myhomeview.setLayoutManager(new LinearLayoutManager(this));
//send query to firebase database
mHomeFireBaseDatabase = FirebaseDatabase.getInstance();
DataHomeRef = mHomeFireBaseDatabase.getInstance().getReference("DataHome").child("Home1");
}
@Override
public boolean onOptionsItemSelected (MenuItem item){
int id = item.getItemId();
if(id == android.R.id.home){
//ends the activity
this.finish();
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onStart() {
super.onStart();
Query query = FirebaseDatabase.getInstance()
.getReference("DataHome")
.child("Home1");
FirebaseRecyclerOptions<DataHome> options =
new FirebaseRecyclerOptions.Builder<DataHome>()
.setQuery(DataHomeRef, DataHome.class)
.build();
FirebaseRecyclerAdapter<DataHome,DataHomeViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<DataHome, DataHomeViewHolder>(options) {
@NonNull
@Override
public DataHomeViewHolder onCreateViewHolder(ViewGroup parent, int viewtype) {
final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_home_deatil, parent, false);
return new DataHomeViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull DataHomeViewHolder holder, int position, @NonNull DataHome model) {
holder.setDetails(getApplicationContext(), model.getTitle(), model.getImage(), model.getDescription() , model.getIngredients(), model.getDirections());
}
};
firebaseRecyclerAdapter.startListening();
myhomeview.setAdapter(firebaseRecyclerAdapter);
}
//DataHomeViewHolder class
public static class DataHomeViewHolder extends RecyclerView.ViewHolder {
View mview;
public DataHomeViewHolder(@NonNull View itemView) {
super(itemView);
mview = itemView;
}
public void setDetails(Context ctx, String title, String image, String description, String ingredients , String directions) {
//Views
TextView mHomeTitle = mview.findViewById(R.id.titlewords);
ImageView mHomeImage = mview.findViewById(R.id.loading_pic);
TextView mDescriptionTitle = mview.findViewById(R.id.descriptionwords);
TextView mIngredientsTitle = mview.findViewById(R.id.ingredientwords);
TextView mDirectionsTitle = mview.findViewById(R.id.directionwords);
//Set data to views
mHomeTitle.setText(title);
mDescriptionTitle.setText(description);
mIngredientsTitle.setText(ingredients);
mDirectionsTitle.setText(directions);
Picasso.get().load(image).into(mHomeImage);
}
}
}
编辑:更改的类是:
公共类BeefSamosa扩展应用程序活动{
私人FirebaseRecyclerAdapter FirebaseRecyclerAdapter
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_beef_samosa);
//Back Button
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("Beef Samosa");
RecyclerView recyclerView = findViewById(R.id.beef_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("DataHome");
FirebaseRecyclerOptions<DataHome> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<DataHome>()
.setQuery(query, DataHome.class)
.build();
firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<DataHome, DataHomeViewHolder>(firebaseRecyclerOptions) {
@Override
protected void onBindViewHolder(@NonNull DataHomeViewHolder dataHomeViewHolder, int position, @NonNull DataHome dataHome) {
dataHomeViewHolder.setDataHome(dataHome);
}
@Override
public DataHomeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.homedetail, parent, false);
return new DataHomeViewHolder(view);
}
};
recyclerView.setAdapter(firebaseRecyclerAdapter);
}
@Override
protected void onStart() {
super.onStart();
firebaseRecyclerAdapter.startListening();
}
@Override
protected void onStop() {
super.onStop();
if (firebaseRecyclerAdapter!= null) {
firebaseRecyclerAdapter.stopListening();
}
}
@Override
public boolean onOptionsItemSelected (MenuItem item){
int id = item.getItemId();
if(id == android.R.id.home){
//ends the activity
this.finish();
}
return super.onOptionsItemSelected(item);
}
//DataHomeViewHolder class
private class DataHomeViewHolder extends RecyclerView.ViewHolder {
private TextView imagetoo, titletext, description, ingredients, directions;
DataHomeViewHolder(View itemView){
super(itemView);
imagetoo = itemView.findViewById(R.id.imagetoo);
titletext = itemView.findViewById(R.id.titletext);
description = itemView.findViewById(R.id.description);
ingredients = itemView.findViewById(R.id.ingredients);
directions = itemView.findViewById(R.id.directions);
}
void setDataHome(DataHome DataHome) {
String imageto = DataHome.getImage();
imagetoo.setText(imageto);
String titleto = DataHome.getTitle();
titletext.setText(titleto);
String descriptionto = DataHome.getDescription();
description.setText(descriptionto);
String ingredientsto = DataHome.getIngredients();
ingredients.setText(ingredientsto);
String directionsto = DataHome.getDirections();
directions.setText(directionsto);
}
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_beef_samosa);
//后退按钮
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle(“牛肉沙摩沙”);
RecyclerView RecyclerView=findViewById(R.id.beef\U视图);
recyclerView.setLayoutManager(新的LinearLayoutManager(本));
DatabaseReference rootRef=FirebaseDatabase.getInstance().getReference();
Query Query=rootRef.child(“DataHome”);
FirebaseRecyclerOptions FirebaseRecyclerOptions=新建FirebaseRecyclerOptions.Builder()
.setQuery(查询,DataHome.class)
.build();
firebaseRecyclerAdapter=新的firebaseRecyclerAdapter(firebaseRecyclerOptions){
@凌驾
受保护的无效onBindViewHolder(@NonNull DataHomeViewHolder DataHomeViewHolder,int位置,@NonNull DataHome DataHome){
dataHomeViewHolder.setDataHome(dataHome);
}
@凌驾
公共数据HomeViewHolder onCreateViewHolder(视图组父级,int-viewType){
View=LayoutFlater.from(parent.getContext()).flate(R.layout.homedetail,parent,false);
返回新的DataHomeViewHolder(视图);
}
};
recyclerView.setAdapter(firebaseRecyclerAdapter);
}
@凌驾
受保护的void onStart(){
super.onStart();
firebaseRecyclerAdapter.startListening();
}
@凌驾
受保护的void onStop(){
super.onStop();
如果(firebaseRecyclerAdapter!=null){
firebaseRecyclerAdapter.stopListening();
}
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
int id=item.getItemId();
if(id==android.R.id.home){
//结束活动
这个;
}
返回super.onOptionsItemSelected(项目);
}
//DataHomeViewHolder类
私有类DataHomeViewHolder扩展了RecyclerView.ViewHolder{
私人文本查看图像,标题文本,描述,成分,说明;
DataHomeViewHolder(查看项目视图){
超级(项目视图);
imagetoo=itemView.findviewbyd(R.id.imagetoo);
titletext=itemView.findviewbyd(R.id.titletext);
description=itemView.findviewbyd(R.id.description);
配料=itemView.findViewById(R.id.Components);
方向=itemView.findViewById(R.id.directions);
}
void setDataHome(DataHome DataHome){
字符串imageto=DataHome.getImage();
setText(imageto);
字符串titleto=DataHome.getTitle();
titletext.setText(titleto);
String description=DataHome.getDescription();
description.setText(descriptionto);
字符串ingredientsto=DataHome.getComponents();
成分。setText(IngCreditsTo);
String directionsto=DataHome.getDirections();
方向.setText(方向到);
}
}
}您将收到以下错误:
Fatal Exception Main: Process: com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.tmrecipes.Model.DataHome
因为Home1
节点下的子节点是字符串,而不是DataHome
对象。要解决此问题,您需要向FirebaseRecyclerOptions
对象传递一个查询,该查询指向存在DataHome
对象的节点。因此,请更改以下代码行:
Query query = FirebaseDatabase.getInstance()
.getReference("DataHome")
.child("Home1");
到
请参阅,我已删除对.child(“Home1”)
的调用,因为这会产生错误。此更改将帮助您显示所有DataHome
节点中存在的所有DataHome
对象
例如,如果您只想显示Home1
的详细信息,则无需使用Firebase UI库,您只需获取所有属性的值并将其显示在列表中,如我在本文中的回答所述:
myhomeview.setAdapter(firebaseRecyclerAdapter)代码>在firebaseRecyclerAdapter.startListening()之前代码>?当我使用代码时;当我点击主页片段上的按钮进入新页面时(新页面是我在问题中输入的类),新页面将不显示任何内容,应用程序将崩溃。当我尝试调用myhomeview.setAdapter(firebaseRecyclerAdapter)时;日志显示致命异常Main:Process:com.google.firebase.database.DatabaseException:无法将java.lang.String类型的对象转换为com.example.tmrecipes.Model.DataHome类型,位于com.google.firebase.database.core.utilities coding.ToCustomClass(com.google.firebase:firebase数据库@@16.1.0:79)…等等。还请添加您的数据库结构。我在postAlright中添加了上面的图像更改查询的方法不正确,但我现在将尝试按照您在另一篇文章中解释的方法进行操作。第一个解决方案是显示DataHome
对象,另一个可以帮助您显示单个对象的属性。好的,随时通知我。我换了班,但我还是
Query query = FirebaseDatabase.getInstance()
.getReference("DataHome")
.child("Home1");
Query query = FirebaseDatabase.getInstance()
.getReference("DataHome");