简体   繁体   中英

Getting null value in android App when data is retrieve from firebase

I want to get the value of cost and product name from the date child for all products. I am getting null value for above code.

How to get the value from different Childs?

My Java Class:

public class CompleteExpenses {

   String product;
   String date;
   Long cost;
   Long quantity;

    public CompleteExpenses() {

    }

    public String getProduct() {
        return product;
    }

    public void setProduct(String product) {
        this.product = product;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public Long getCost() {
        return cost;
    }

    public void setCost(Long cost) {
        this.cost = cost;
    }

    public Long getQuantity() {
        return quantity;
    }

    public void setQuantity(Long quantity) {
        this.quantity = quantity;
    }
}

My adapter:

public class Product_Adapter extends RecyclerView.Adapter {

    List<CompleteExpenses> completeExpensesList;

    public Product_Adapter(List<CompleteExpenses> completeExpensesList) {
        this.completeExpensesList = completeExpensesList;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.product_layout,parent,false);
        ViewHolderClass viewHolderClass=new ViewHolderClass(view);
        return viewHolderClass;

    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

        ViewHolderClass viewHolderClass = (ViewHolderClass) holder;

        CompleteExpenses completeExpenses = completeExpensesList.get(position);

        String strName = String.valueOf(completeExpenses.getProduct());
        viewHolderClass.pr.setText(strName);

        String strCost = String.valueOf(completeExpenses.getCost());
        viewHolderClass.cs.setText(strCost);
    }
    @Override
    public int getItemCount() {
        return completeExpensesList.size();
    }

    public class ViewHolderClass extends RecyclerView.ViewHolder{

        TextView pr,cs;

        public ViewHolderClass(@NonNull View itemView) {
            super(itemView);
        pr = (TextView) itemView.findViewById(R.id.tv_productname);
            cs = (TextView) itemView.findViewById(R.id.tv_costsum);

        }
    }
}

    

Java activity:

public class complete_expenses extends AppCompatActivity {

    List<CompleteExpenses> completeExpenses;
    RecyclerView recyclerView;
    Product_Adapter product_adapter;
    DatabaseReference databaseReference,databaseReference1;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_complete_expenses);
        recyclerView=findViewById(R.id.rv_products);
        recyclerView.setHasFixedSize(true);
        LinearLayoutManager llm = new LinearLayoutManager(this);
        llm.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(llm);


        databaseReference= FirebaseDatabase.getInstance().getReference().child("Project 1").child("CompleteExpenses");

        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                completeExpenses = new ArrayList<CompleteExpenses>();
                CompleteExpenses e = snapshot.getValue(CompleteExpenses.class);
                completeExpenses.add(e);
                product_adapter=new Product_Adapter(completeExpenses);
                recyclerView.setAdapter(product_adapter);



            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });



    }
}

Firebase structure:

https://i.stack.imgur.com/tcBWB.png

You're reading all data from Project 1/CompleteExpenses and are then trying to read a single object with properties cost , date , product and quantity from there.

If we look at your JSON however, the Project 1/CompleteExpenses doesn't have those properties. Instead those properties exist on a child node (and presumably other child nodes) two levels lower in your JSON.

So you'll either need to read data from the lower level in your JSON :

databaseReference= FirebaseDatabase.getInstance().getReference()
                            .child("Project 1/CompleteExpenses/M-Sand/11-2-2021");

databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        completeExpenses = new ArrayList<CompleteExpenses>();
        CompleteExpenses e = snapshot.getValue(CompleteExpenses.class);

Or you'll need to navigate over the data that you've read in the onDataChange :

databaseReference= FirebaseDatabase.getInstance().getReference().child("Project 1").child("CompleteExpenses");

databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        completeExpenses = new ArrayList<CompleteExpenses>();
        for (DataSnapshot nameSnapshot: snapshot.getChildren()) {
            for (DataSnapshot dateSnapshot: nameSnapshot.getChildren()) {
                CompleteExpenses e = dateSnapshot.getValue(CompleteExpenses.class);
                completeExpenses.add(e);
            }
        }
        product_adapter=new Product_Adapter(completeExpenses);
        recyclerView.setAdapter(product_adapter);
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM