0

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..

enter image description here

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.

enter image description here

Hopefully somebody can see what I've missed.

Robert Goodrick
  • 190
  • 1
  • 11

1 Answers1

0

The problem was a reference path mistake. You'll notice the settlementId in the data was "-LaSu7s73QvpfeE6D3TS" but the logged reference path didn't have the dash "-".

"LaSu7s73QvpfeE6D3TS" should have been "-LaSu7s73QvpfeE6D3TS"

Robert Goodrick
  • 190
  • 1
  • 11