【问题标题】:Retrieva Data from Firebase for RecyclerView从 Firebase 为 RecyclerView 检索数据
【发布时间】:2021-02-23 10:21:31
【问题描述】:

我创建了一个 recyclerView,我想从 firebase 检索数据并将其显示在 recyclerview 中。我创建了两个模型。
检查图片以获取 Firebase

包含 id、price、productId、productName 和数量的订单来自另一个列表。
例如,我想在 orderDetails 中设置 setText productName
我不能采取同样的方式,因为是另一个列表
我使用正确的地址、日期时间名称和付款方式。但是当我使用 productName 时为 null

我的请求模型是:

public class Request {

    private String name;
    private String address;
    private String total;
    private String datetime;
    private String paymentMethod;
    private List<CoffeeOrder> order;


    public Request() {
    }

    public Request(String name, String address, String total, String datetime, String paymentMethod, List<CoffeeOrder> order) {
        this.name = name;
        this.address = address;
        this.total = total;
        this.datetime = datetime;
        this.paymentMethod = paymentMethod;
        this.order = order;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getTotal() {
        return total;
    }

    public void setTotal(String total) {
        this.total = total;
    }

    public String getDatetime() {
        return datetime;
    }

    public void setDatetime(String datetime) {
        this.datetime = datetime;
    }

    public String getPaymentMethod() {
        return paymentMethod;
    }

    public void setPaymentMethod(String paymentMethod) {
        this.paymentMethod = paymentMethod;
    }

    public List<CoffeeOrder> getOrder() {
        return order;
    }

    public void setOrder(List<CoffeeOrder> order) {
        this.order = order;
    }
}

我的 CoffeeOrder 模型是:

public class CoffeeOrder {

    private int ID;
    private String ProductId;
    private String ProductName;
    private String Quantity;
    private String Price;

    public CoffeeOrder() {
    }


    public CoffeeOrder(int ID, String productId, String productName, String quantity, String price) {
        this.ID = ID;
        ProductId = productId;
        ProductName = productName;
        Quantity = quantity;
        Price = price;

    }


    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public String getProductId() {
        return ProductId;
    }

    public void setProductId(String productId) {
        ProductId = productId;
    }

    public String getProductName() {
        return ProductName;
    }

    public void setProductName(String productName) {
        ProductName = productName;
    }

    public String getQuantity() {
        return Quantity;
    }

    public void setQuantity(String quantity) {
        Quantity = quantity;
    }

    public String getPrice() {
        return Price;
    }

    public void setPrice(String price) {
        Price = price;
    }
}

我的适配器是:

public class UserOrderAdapter extends RecyclerView.Adapter<UserOrderAdapter.UserOrderViewHolder> {

    ArrayList<Request> myList;
    Context context;
    List<CoffeeOrder> coffeeList;


    public UserOrderAdapter(Context context, ArrayList<Request> myList,List<CoffeeOrder> coffeeList) {
        this.myList = myList;
        this.context = context;
        this.coffeeList = coffeeList;
    }

    @NonNull
    @Override
    public UserOrderViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(context).inflate(R.layout.order_item, parent, false);
        return new UserOrderViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull UserOrderViewHolder holder, int position) {

        Request request = myList.get(position);

        holder.usernameText.setText(request.getName());
        holder.orderTotalPrice.setText(request.getTotal());
        holder.orderDate.setText(request.getDatetime());
        holder.paymentMethod.setText(request.getPaymentMethod());


        for(CoffeeOrder item:coffeeList) {
            holder.orderDetails.setText(item.getProductName());
        }



    }

    @Override
    public int getItemCount() {
        return myList.size();
    }

    public static class UserOrderViewHolder extends RecyclerView.ViewHolder {

        TextView usernameText, orderTotalPrice, orderDate, paymentMethod, orderDetails;


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

            usernameText = (itemView).findViewById(R.id.username_text);
            orderTotalPrice = (itemView).findViewById(R.id.order_total_price);
            orderDate = (itemView).findViewById(R.id.order_date);
            paymentMethod = (itemView).findViewById(R.id.payment_method);
            orderDetails = (itemView).findViewById(R.id.order_details);


        }

    }

}

我的活动是:

public class UserOrderActivity extends AppCompatActivity {

    RecyclerView recyclerOrders;
    private FirebaseDatabase db = FirebaseDatabase.getInstance();
    private DatabaseReference ref = db.getReference().child("Requests");
    private UserOrderAdapter adapter;
    private ArrayList<Request> list;
    private List<CoffeeOrder> coffeeList;
    Toolbar toolbar;
    TextView userOrderBlankText;

    GifImageView gifImageView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_order);

        toolbar = findViewById(R.id.toolbar);
        gifImageView = findViewById(R.id.order_giffy);
        userOrderBlankText = findViewById(R.id.user_order_blank_text);

        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        recyclerOrders = findViewById(R.id.recycler_orders);
        recyclerOrders.setHasFixedSize(true);
        recyclerOrders.setLayoutManager(new LinearLayoutManager(this));

        list = new ArrayList<>();
        coffeeList = new ArrayList<>();
        adapter = new UserOrderAdapter(UserOrderActivity.this, list,coffeeList);
        recyclerOrders.setAdapter(adapter);


        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {

                for(DataSnapshot dataSnapshot : snapshot.getChildren()){
                    Request request = dataSnapshot.getValue(Request.class);
                    list.add(request);
                }

                adapter.notifyDataSetChanged();

                if (list.size() == 0) {
                    gifImageView.setVisibility(GifImageView.VISIBLE);
                    userOrderBlankText.setVisibility(View.VISIBLE);
                }
            }

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

            }
        });

    }
}

【问题讨论】:

  • 您正在将列表分配给适配器,而它仍然为空
  • @kgori_dev 我该如何工作?
  • 检查答案部分,我回答了
  • @kgori_dev 以及如何在适配器中获取产品名称?
  • 这段代码中到底有什么不符合您的预期?请回复@AlexMamo

标签: android firebase firebase-realtime-database android-recyclerview


【解决方案1】:

试试这个

public class UserOrderActivity extends AppCompatActivity {

RecyclerView recyclerOrders;
private FirebaseDatabase db = FirebaseDatabase.getInstance();
private DatabaseReference ref = db.getReference().child("Requests");
private UserOrderAdapter adapter;
private ArrayList<Request> list;

Toolbar toolbar;
TextView userOrderBlankText;

GifImageView gifImageView;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_user_order);

    toolbar = findViewById(R.id.toolbar);
    gifImageView = findViewById(R.id.order_giffy);
    userOrderBlankText = findViewById(R.id.user_order_blank_text);

    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    recyclerOrders = findViewById(R.id.recycler_orders);
    recyclerOrders.setHasFixedSize(true);
    recyclerOrders.setLayoutManager(new LinearLayoutManager(this));

    list = new ArrayList<>();
    

    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {

            for(DataSnapshot dataSnapshot : snapshot.getChildren()){
                Request request = dataSnapshot.getValue(Request.class);
                list.add(request);
            }
            adapter = new UserOrderAdapter(UserOrderActivity.this, list);
            recyclerOrders.setAdapter(adapter);
            adapter.notifyDataSetChanged();

            if (list.size() == 0) {
                gifImageView.setVisibility(GifImageView.VISIBLE);
                userOrderBlankText.setVisibility(View.VISIBLE);
            }
        }

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

        }
    });

}
}

【讨论】:

  • 以及如何在适配器中获取产品名称?
  • 虽然这可能会回答问题,但代码块本身通常不是有用的答案,而且更有可能吸引反对票。建议解释您所展示的解决方案的作用,以及该代码为何/如何回答问题。
  • @AlexMamo 我采用正确的地址、日期时间名称和付款方式。但是当我采用 productName 时为空。我更新我的代码。如果你想要破解代码适配器
  • @AlexMamo 感谢您的注意...我将编辑答案并添加相关信息
  • @usern 在构造函数和设置器上使用 this 关键字,例如 public void setProductName(String productName) { this.ProductName = productName; }
猜你喜欢
  • 2021-09-01
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 2021-09-14
  • 2018-09-10
  • 1970-01-01
相关资源
最近更新 更多