Заполнение RecyclerView во фрагменте данными из FirebaseDatabase - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь заполнить мой recyclerview, встроенный во фрагмент, данными из моей базы данных firebase realtime. Я просто пытаюсь отобразить названия всех продуктов питания в моей базе данных, и мне что-то не хватает, или что-то не так с моим запросом, потому что мой фрагмент пуст, и у меня нет ошибок. Я новичок в android, и я действительно борюсь с этим, и мне нужна помощь ... Моя база данных настроена следующим образом:

Структура базы данных Firebase

Вот мой модельный класс

public class Foods {
    public String name;
    private String lifecycle; //in days
    private String quantity;


    public Foods(){}

    public Foods(String name, String quantity, String lifecycle){
        this.name = name;
        this.quantity = quantity;
        this.lifecycle = lifecycle;

    }

    public String getName() {
        return name;
    }

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

    public String getLifecycle() {
        return lifecycle;
    }

    public void setLifecycle(String lifecycle) {
        this.lifecycle = lifecycle;
    }

Вот мой фрагмент


public class GroceryListFragment extends Fragment {

    private DatabaseReference ref;
    //private FirebaseRecyclerAdapter<Foods, SimpleStringRecyclerViewAdapter.ViewHolder> mFirebaseAdapter;
    private FirebaseRecyclerAdapter<Foods, FoodViewHolder> adapter;
    private FirebaseRecyclerOptions<Foods> options;
    private RecyclerView rv;
    private List<String> mValues;
    private int mBackground;
    View v;
    List<Foods> mDataSet;


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        v = inflater.inflate(R.layout.frag_food_list, container, false);
        rv = (RecyclerView) v.findViewById(R.id.recyclerview);



//        rv = (RecyclerView) inflater.inflate(
//                R.id.recyclerview, container, false);
//        setupRecyclerView(rv);

        mDataSet = new ArrayList<>();
        rv = v.findViewById(R.id.recyclerview);
        rv.setLayoutManager(new LinearLayoutManager(getActivity()));

        Query query = FirebaseDatabase.getInstance().getReference().child("Pantry");
        options = new FirebaseRecyclerOptions.Builder<Foods>().setQuery(query, Foods.class).build();
        adapter = new FirebaseRecyclerAdapter<Foods, FoodViewHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull FoodViewHolder holder, int position, @NonNull Foods model) {
                model = mDataSet.get(position);
                holder.mTextView.setText(model.getName());
                final Foods finalModel = model;

                holder.mBoundString = mValues.get(position);


                holder.mView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Context context = v.getContext();
                        Intent intent = new Intent(context, PantryDetailActivity.class);
                        intent.putExtra(PantryDetailActivity.EXTRA_NAME, holder.mBoundString);

                        context.startActivity(intent);
                    }
                });

                RequestOptions rOptions = new RequestOptions();
                Glide.with(holder.mImageView.getContext())
                        .load(Foods.getRandFoodImage())
                        .apply(rOptions.fitCenter())
                        .into(holder.mImageView);
            }


            @NonNull
            @Override
            public FoodViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.list_item, parent, false);
                view.setBackgroundResource(mBackground);
                return new FoodViewHolder(view);

            }
        };

        ref.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                HashMap<String, String> value = (HashMap<String, String>) dataSnapshot.getValue();
                if (value != null) {
                    String name = value.get("name");
                    String lifecycle = value.get("lifecycle");
                    String quantity = value.get("quantity");
                    mDataSet.add(new Foods(name, quantity, lifecycle));

                }
            }


            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

        rv.setAdapter(adapter);

        adapter.startListening();
        rv.setLayoutManager(new LinearLayoutManager(rv.getContext()));
        rv.setAdapter(adapter);

        return rv;
    }

Вот мой FoodViewHolder

package com.support.android.designlibdemo;


import androidx.recyclerview.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;


public class FoodViewHolder extends RecyclerView.ViewHolder {
    public String mBoundString;
    public  View mView;
    public  ImageView mImageView;
    public  TextView mTextView;




    public FoodViewHolder(View v) {
        super(v);
        this.mView = v;
        mTextView = itemView.findViewById(R.id.name);
        mImageView = itemView.findViewById(R.id.avatar);

    }


}

это мой макет для frag_food_list

<?xml version="1.0" encoding="utf-8"?>

<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

это мой макет для list_item

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="8dp"
    android:paddingBottom="8dp"
    android:gravity="center_vertical">

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/avatar"
        android:layout_width="@dimen/list_item_avatar_size"
        android:layout_height="@dimen/list_item_avatar_size"
        android:layout_marginEnd="16dp"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/name"
        android:textAppearance="?attr/textAppearanceListItem"/>

</LinearLayout>

Я работал над этим в течение нескольких дней безуспешно, и я рассмотрел все другие вопросы stackoverflow, касающиеся фрагментов, firebase и recyclerview и все, что это привело меня в еще большее замешательство. Я добавил HashMap в соответствии с другим вопросом о переполнении стека, и я получил эту ошибку:

java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firebase.database.ChildEventListener com.google.firebase.database.DatabaseReference.addChildEventListener(com.google.firebase.database.ChildEventListener)' on a null object reference

До того, как я добавил хэш-карту, у меня не было ошибок, но фрагмент был полностью пуст. Я не знаю что делать Пожалуйста, помогите мне.

...