Issue
This is my Firebase Database snippet
I am trying to get the name of the expense and the expense amount and set it into a RecyclerView
.
This is my adapter for the RecyclerView:
public class ExpenseAdapter extends RecyclerView.Adapter<ExpenseAdapter.MyViewHolder> {
Context context;
ArrayList<Expense> list;
public ExpenseAdapter(Context context, ArrayList<Expense> list) {
this.context = context;
this.list = list;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(context).inflate(R.layout.expense_item, parent, false);
return new MyViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull ExpenseAdapter.MyViewHolder holder, int position) {
Expense expense = list.get(position);
holder.expenseNameText.setText(expense.getName());
holder.expenseAmountText.setText(expense.getAmount());
holder.expenseAmountSign.setText(expense.getType());
// String type = expense.getType();
// if(type.equals("Credit")) {
// holder.expenseAmountSign.setText("+ ");
// holder.expenseAmountSign.setTextColor(Color.GREEN);
// } else if(type.equals("Debit")) {
// holder.expenseAmountSign.setText("- ");
// holder.expenseAmountSign.setTextColor(Color.RED);
// }
}
@Override
public int getItemCount() {
return list.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
TextView expenseNameText, expenseAmountText, expenseAmountSign;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
expenseNameText = itemView.findViewById(R.id.expenseNameText);
expenseAmountText = itemView.findViewById(R.id.expenseAmountText);
expenseAmountSign = itemView.findViewById(R.id.expenseAmountSign);
}
}
}
This is my POJO class for Expense Model
package com.inamul.ledgers;
public class Expense {
String name, amount, type;
public Expense() { }
public Expense(String name, String amount, String type) {
this.name = name;
this.amount = amount;
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAmount() {
return amount;
}
public void setAmount(String amount) {
this.amount = amount;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public String toString() {
return "Expense{" +
"name='" + name + '\'' +
", amount='" + amount + '\'' +
", type='" + type + '\'' +
'}';
}
}
This is my code snippet
String path = Objects.requireNonNull(mAuth.getUid()) + "/ledgers/" + ledgerName + "/expenses/";
// Database Reference
databaseReference = FirebaseDatabase.getInstance().getReference(path);
databaseReference.addValueEventListener(new ValueEventListener() {
@SuppressLint("NotifyDataSetChanged")
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
list.clear();
for(DataSnapshot dataSnapshot: snapshot.getChildren()) {
Expense expense = dataSnapshot.getValue(Expense.class);
assert expense != null;
Log.d("TAG", expense.toString());
list.add(expense);
}
expenseAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
The log shows that every value in the expense class has been set to null and the database path seems to be fine
2022-07-19 13:05:01.761 26621-26621/com.inamul.expenser D/TAG: Expense{name='null', amount='null', type='null'}
2022-07-19 13:05:01.755 26621-26621/com.inamul.expenser D/PATH: XELPjRzISJN969d0ttPQeheyG1r1/ledgers/Company/expenses/
This is the output
What am I doing wrong?
Solution
You're getting null for each property:
D/TAG: Expense{name='null', amount='null', type='null'}
Because in the database there is no property called name
, amount
, or type
. So the simplest solution I can think of would be to change the Expense
class declaration to:
public class Expense {
String expenseName, expenseAmount, expenseType;
public Expense() { }
public Expense(String expenseName, String expenseAmount, String expenseType) {
this.expenseName = expenseName;
this.expenseAmount = expenseAmount;
this.expenseType = expenseType;
}
public String getExpenseName() {
return expenseName;
}
public void setExpenseName(String expenseName) {
this.expenseName = expenseName;
}
public String getExpenseAmount() {
return expenseAmount;
}
public void setExpenseAmount(String expenseAmount) {
this.expenseAmount = expenseAmount;
}
public String getExpenseType() {
return expenseType;
}
public void setExpenseType(String expenseType) {
this.expenseType = expenseType;
}
@Override
public String toString() {
return "Expense{" +
"expenseName='" + expenseName + '\'' +
", expenseAmount='" + expenseAmount + '\'' +
", expenseType='" + expenseType + '\'' +
'}';
}
}
So it can match the name in the database.
Answered By - Alex Mamo
Answer Checked By - Pedro (JavaFixing Volunteer)