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