I'm having i'm assuming a brain fart with FB DB while building fuel receipt tracking for app users. I've got the current database structure..
The hierarchy is "settlements/userId/settlementId/fuel". The goal is to return all children under the key of "fuel" of any given settlement for that user. There will be other entries not related to fuel but to the same settlementId in the future.
Here is my valueEventListener to retrieve the data..
public class FragmentFuel extends Fragment {
private ArrayList<Fuel> fuel = new ArrayList<>();
private Context context;
private MI MI;
private RecyclerView.Adapter recyclerAdapter = new recyclerAdapter();
private ValueEventListener valueEventListener;
private DatabaseReference reference;
//private DecimalFormat usdFormat = new DecimalFormat("#.00");
public FragmentFuel() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Logger.i(dataSnapshot.getRef().toString());
Logger.i("COUNT " + dataSnapshot.getChildrenCount());
fuel.clear();
for (DataSnapshot child : dataSnapshot.getChildren()) {
fuel.add(child.getValue(Fuel.class));
}
recyclerAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_fuel, container, false);
RecyclerView recyclerView = v.findViewById(R.id.recycler);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
recyclerView.setAdapter(recyclerAdapter);
return v;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.context = context;
MI = (MI) getActivity();
}
@Override
public void onStart() {
super.onStart();
if (MI != null) {
reference = MI.getReference().child("settlements").child(MI.getUID()).child(MI.getSID()).child("fuel");
reference.addValueEventListener(valueEventListener);
}
}
@Override
public void onStop() {
super.onStop();
reference.removeEventListener(valueEventListener);
}
@Override
public void onDetach() {
super.onDetach();
MI = null;
}
private class recyclerAdapter extends RecyclerView.Adapter<recyclerAdapter.viewHolder> {
@Override
public viewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new viewHolder(getLayoutInflater().inflate(R.layout.fuel_row, parent, false));
}
@Override
public void onBindViewHolder(viewHolder holder, int position) {
Fuel row = fuel.get(position);
holder.date.setText(TimeConvert.toDateAndTime(row.getStamp()));
holder.cost.setText("$" + formatInt(row.getCost()));
holder.odometer.setText("odometer: " + formatInt(row.getOdometer()));
holder.gallons.setText(formatInt(row.getGallons()) + " gallons");
if (row.getNote().equals("")) holder.note.setVisibility(View.GONE);
else holder.note.setVisibility(View.VISIBLE);
holder.note.setText(row.getNote());
}
@Override
public int getItemCount() {
return fuel.size();
}
class viewHolder extends RecyclerView.ViewHolder {
TextView date, cost, odometer, gallons, note;
viewHolder(View itemView) {
super(itemView);
date = itemView.findViewById(R.id.date);
cost = itemView.findViewById(R.id.cost);
odometer = itemView.findViewById(R.id.odometer);
gallons = itemView.findViewById(R.id.gallons);
note = itemView.findViewById(R.id.note);
}
}
}
private String formatInt(int count) {
return NumberFormat.getNumberInstance(Locale.US).format(count);
}
}
My log output shows OnDataChanged being called properly but getChildCount() returns a value of 0. The reference path is correct and should return 4 children.
Hopefully somebody can see what I've missed.