繁体   English   中英

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

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

当我的主页片段通过意图使用常规按钮进入新课程时。 在新类上,当我尝试使用RecylerVie和 Firebase 显示数据时,数据没有出现并且应用程序崩溃。

在我的 Firebase 上,节点从项目 --> 到 DataHome --> Home1。 主页 1 具有描述、方向、成分、图像、标题的属性

DataHome 也有其他名为 Home2 的节点,等等。但在这种情况下,我只是想在这个类上显示来自 Home1 的数据。

数据库图像

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

        }


    }
}

我的模型类是:

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

    }

编辑:更改后的类是:

公共类 BeefSamosa 扩展了 AppCompatActivity {

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

}

您收到以下错误:

 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节点下的Home1节点是字符串而不是DataHome对象。 要解决此问题,您需要向FirebaseRecyclerOptions对象传递一个查询,该查询指向DataHome对象所在的节点。 因此,请更改以下代码行:

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

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

看,我已经删除了对.child("Home1")的调用,因为这会产生错误。 此更改将帮助您显示所有DataHome节点中存在的所有DataHome对象。

例如,如果您只想显示Home1的详细信息,则无需使用 Firebase-UI 库,您只需获取所有属性的值并将它们显示在列表中,如我在这篇文章中的回答中所述:

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM