Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建新活动后如何显示RecyclerView,Android Firebase_Java_Android_Firebase_Firebase Realtime Database_Android Recyclerview - Fatal编程技术网

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");