简体   繁体   English

创建新活动后如何显示 RecyclerView,Android Firebase

[英]How to show RecyclerView after a new activity is created, Android Firebase

When my Home fragment uses regular buttons through intent to go to a new class.当我的主页片段通过意图使用常规按钮进入新课程时。 On the new class when I try to use RecylerVie and Firebase to show data, the data does not appear and the app crashes.在新类上,当我尝试使用RecylerVie和 Firebase 显示数据时,数据没有出现并且应用程序崩溃。

On my Firebase the nodes go from project --> to DataHome --> Home1.在我的 Firebase 上,节点从项目 --> 到 DataHome --> Home1。 Home 1 has the attributes description,directions, ingredients, image, title主页 1 具有描述、方向、成分、图像、标题的属性

DataHome also has other nodes named Home2, etc. But in this case I'm only trying to show data from Home1 on this class. DataHome 也有其他名为 Home2 的节点,等等。但在这种情况下,我只是想在这个类上显示来自 Home1 的数据。

database image数据库图像

The logcat says 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 logcat 说致命异常 Main: Process: com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.tmrecipes.Model.DataHome

This is the class:这是课程:

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

        }


    }
}

My model class is:我的模型类是:

 public class DataHome {

        public String title ,image, description, ingredients, directions;

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getImage() {
            return image;
        }

        public void setImage(String image) {
            this.image = image;
        }

        public String getDescription() {
            return description;
        }

        public void setDescription(String description) {
            this.description = description;
        }

        public String getIngredients() {
            return ingredients;
        }

        public void setIngredients(String ingredients) {
            this.ingredients = ingredients;
        }

        public String getDirections() {
            return directions;
        }

        public void setDirections(String directions) {
            this.directions = directions;
        }

        public DataHome(String title, String image, String description, String ingredients, String directions){
            this.title =title;
            this.image = image;
            this.description = description;
                this.ingredients = ingredients;
                this.directions=directions;
            }

    }

Edit: The changed class is:编辑:更改后的类是:

public class BeefSamosa extends AppCompatActivity {公共类 BeefSamosa 扩展了 AppCompatActivity {

private FirebaseRecyclerAdapter firebaseRecyclerAdapter;私有 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);
    }
}

} }

You are getting the following error:您收到以下错误:

 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

Because the children under Home1 node are strings and not DataHome objects.因为Home1节点下的Home1节点是字符串而不是DataHome对象。 To solve this, you need to pass to your FirebaseRecyclerOptions object a query that points to a node where DataHome objects exist.要解决此问题,您需要向FirebaseRecyclerOptions对象传递一个查询,该查询指向DataHome对象所在的节点。 So please change the following line of code:因此,请更改以下代码行:

Query query = FirebaseDatabase.getInstance()
            .getReference("DataHome")
            .child("Home1");

to

Query query = FirebaseDatabase.getInstance()
            .getReference("DataHome");

See, I have removed the call to .child("Home1") because this is producing the error.看,我已经删除了对.child("Home1")的调用,因为这会产生错误。 This change will help you display all DataHome objects that exist within the all DataHome node.此更改将帮助您显示所有DataHome节点中存在的所有DataHome对象。

If you want to display only the details of Home1 for example, there is no need to use the Firebase-UI library, you can simply get the value of all properties and display them in a list as explained in my answer from this post:例如,如果您只想显示Home1的详细信息,则无需使用 Firebase-UI 库,您只需获取所有属性的值并将它们显示在列表中,如我在这篇文章中的回答中所述:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用 firebase 数据库在 recyclerview 中打开新活动 - How to open new activity in recyclerview with firebase database 如何在Android Studio中使用Firebase在新活动中显示通知数据? - how to show the notification data in new activity using firebase in android studio? 单击 RecyclerView 后,当我想在新活动中显示详细信息时出现错误。 使用 Firebase - Get error when I want to display detail in new activity after click on RecyclerView. Using Firebase 更新类别 recyclerView 后如何显示“NEW”标签 - How to show 'NEW' tag after updating category recyclerView 创建新的Firebase电子邮件密码用户帐户后,Firebase用户的显示名称不会在活动中显示吗? - Firebase user display name won't show on activity after creating new Firebase email password user account? 在Android的RecyclerView中显示Firebase中的数据 - Show data from Firebase in RecyclerView on Android 推送Firebase android后如何显示值? - How to show the value after push Firebase android? 验证电子邮件后如何启动新活动(Firebase) - How to start new activity after get email verified (firebase) 在 android studio 中添加 textwatcher 后,我的 firebase RecyclerView 没有显示任何内容 - My firebase RecyclerView doesnt show anything after added textwatcher in android studio 如何将数据从Recyclerview传递到新活动 - How to pass data from recyclerview to new activity
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM