Как показать RecyclerView после создания нового действия, Android Firebase - PullRequest
0 голосов
/ 26 апреля 2019

Когда мой фрагмент Home использует обычные кнопки через намерение перейти в новый класс.В новом классе, когда я пытаюсь использовать RecylerVie и Firebase для отображения данных, данные не отображаются, и приложение вылетает.

На моем Firebase узлы переходят из проекта -> в DataHome ->Дом 1.В Home 1 есть описание атрибутов, указания, ингредиенты, изображение, заголовок

В DataHome также есть другие узлы с именем Home2 и т. Д. Но в этом случае я только пытаюсь показать данные из Home1 в этом классе.

изображение базы данных

Логкат говорит, что Fatal Exception 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);

        }


    }
}

Мой класс модели:

 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 {

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

}

1 Ответ

0 голосов
/ 27 апреля 2019

Вы получаете следующую ошибку:

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

на

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

Смотри, я удалил вызов на .child("Home1"), потому что это вызывает ошибку.Это изменение поможет вам отобразить все DataHome объекты, которые существуют в узле all DataHome.

Если вы хотите отобразить только детали, например, Home1, вам не нужно использовать Firebase-UI библиотека, вы можете просто получить значение всех свойств и отобразить их в списке, как объяснено в моем ответе из этого поста:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...