Search code examples
androidfirebasefirebase-realtime-databasefirebaseui

FireBaseRecyclerAdapter is not displaying in Android app


My firebaserecyclerView is not showing in the app but the data is added in firebase structure

Here is my Firebase structure

enter image description here

I need to display the expenses name and total in recyclerview

Main Activity

public class DayExpensesActivity extends AppCompatActivity {
private RecyclerView recyclerView;
FirebaseDatabase firebaseDatabase;
DatabaseReference databaseReference;
FirebaseRecyclerAdapter<Expenses,ExpenseViewHolder> firebaseRecyclerAdapter;
RecyclerView.LayoutManager layoutManager;
Query query;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_day_expenses);
recyclerView=(RecyclerView)findViewById(R.id.recyclerView);
    layoutManager=new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);
    firebaseDatabase=FirebaseDatabase.getInstance();
    databaseReference=firebaseDatabase.getReference();
    final Expenses expensesDate = new Expenses(username, monthyr, currentdate);
    query=databaseReference.child("users").child(expensesDate.getUsername()).child(expensesDate.getMonth()).child(expensesDate.getDate());
FirebaseRecyclerOptions<Expenses> options =
            new FirebaseRecyclerOptions.Builder<Expenses>()
                    .setQuery(query, Expenses.class)
                    .build();

    firebaseRecyclerAdapter=new FirebaseRecyclerAdapter<Expenses, ExpenseViewHolder>(options) {

        @Override
        protected void onBindViewHolder(@NonNull ExpenseViewHolder holder, int position, @NonNull Expenses model) {
            holder.expensesText.setText(model.getExpenseName());
            holder.totaltext.setText(model.getTotal());


      @NonNull
        @Override
        public ExpenseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

            View view=LayoutInflater.from(parent.getContext()).inflate(R.layout.expenses_card_layout,parent,false);

            return new ExpenseViewHolder(view);
        }
    };

    firebaseRecyclerAdapter.notifyDataSetChanged();
    recyclerView.setAdapter(firebaseRecyclerAdapter);

ExpensesViewHolder

public class ExpenseViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

public TextView expensesText,totaltext;
public ImageButton addBtn,editBtn;

private ItemClickListener itemClickListener;

public void setItemClickListener(ItemClickListener itemClickListener){
    this.itemClickListener=itemClickListener;
}

public ExpenseViewHolder(View itemView) {
    super(itemView);

    expensesText=(TextView) itemView.findViewById(R.id.expensestext);
    totaltext=(TextView) itemView.findViewById(R.id.totaltxt);
    addBtn=(ImageButton)itemView.findViewById(R.id.add_btn);
    editBtn=(ImageButton)itemView.findViewById(R.id.btn_edt);

    itemView.setOnClickListener(this);

}

@Override
public void onClick(View v) {


    itemClickListener.onClick(v,getAdapterPosition(),false);

}
}

Solution

  • To simply display those two values, please use the following code:

    DatabaseReference ref = databaseReference
        .child("users")
        .child(expensesDate.getUsername())
        .child("Expenses")
        .child(expensesDate.getMonth())
        .child(expensesDate.getDate());
    

    Now you can add a listener to read those values:

    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
                String expenseName = dataSnapshot.child("expenseName").getValue(String.class);
                String total = dataSnapshot.child("total").getValue(String.class);
                Log.d("TAG", expenseName + " / " + total);
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.d(TAG, databaseError.getMessage());
        }
    };
    ref.addListenerForSingleValueEvent(valueEventListener);
    

    The output in your logcat will be:

    pegrol / 76
    

    There is no need to display those values in a RecyclerView because a RecyclerView is used to recycle views and in your case there is no need to recycle a single view.