0

我想从所有产品的子日期中获取成本和产品名称的值。我得到上述代码的空值。

如何从不同的 Childs 中获取价值?

我的 Java 类:

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;
    }
}

我的适配器:

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 活动:

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 结构:

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

4

1 回答 1

1

您正在从那里读取所有数据,然后Project 1/CompleteExpenses尝试从那里读取具有 properties cost、和的单个对象。dateproductquantity

但是,如果我们查看您的 JSON,Project 1/CompleteExpenses则没有这些属性。相反,这些属性存在于 JSON 中低两个级别的子节点(可能还有其他子节点)上。

因此,您要么需要从 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);

或者您需要浏览您在以下位置读取的数据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);
    }
于 2021-02-03T14:42:12.047 回答