【问题标题】:retrieve data of specific value in Firebase recycle view in android studio在 android studio 的 Firebase recyclerview 中检索特定值的数据
【发布时间】:2020-07-12 22:48:01
【问题描述】:

我有一个电子商务 android 应用程序,并且我有所有订单(状态 = 已发货而不是发货enter image description hereped),这些订单由管理员在 Firebase 实时数据库的回收站视图中接收。现在,我想在另一个活动中获得已发货的订单(状态 = 已发货),但我不知道如何仅检索那些状态 = 已发货的订单。我已经尝试了几件事,但无法解决这个问题。所以任何人都可以帮助请回答。 我的 recyclerView 代码如下所示:

shippedOrdersRef = FirebaseDatabase.getInstance().getReference().child("Orders")    
FirebaseRecyclerOptions<AdminOrders> options = new FirebaseRecyclerOptions.Builder<AdminOrders>()
            .setQuery(shippedOrdersRef, AdminOrders.class).build();

    FirebaseRecyclerAdapter<AdminOrders, AdminNewOrdersActivity.AdminOrderViewHolder> adapter =
            new FirebaseRecyclerAdapter<AdminOrders, AdminNewOrdersActivity.AdminOrderViewHolder>(options) {
                @Override
                protected void onBindViewHolder(@NonNull AdminNewOrdersActivity.AdminOrderViewHolder holder, final int i, @NonNull AdminOrders adminOrders)
                {
                    holder.userName.setText("Name: " + adminOrders.getName());
                    holder.userPhoneNumber.setText("Phone: " + adminOrders.getPhone());
                    holder.userTotalPrice.setText("Total Amount =  Rs." + adminOrders.getTotalAmount());
                    holder.userDateTime.setText("Order at: " + adminOrders.getDate() + "  " + adminOrders.getTime());
                    holder.userShippingAddress.setText("Shipping Address: " + adminOrders.getAddress() + ", " + adminOrders.getCity());
                    holder.orderState.setText("" + adminOrders.getState());

     }

                @NonNull
                @Override
                public AdminNewOrdersActivity.AdminOrderViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
                {
                    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.orders_layout, parent, false);
                    return new AdminNewOrdersActivity.AdminOrderViewHolder(view);
                }
            };
    shippedOrdersList.setAdapter(adapter);
    adapter.startListening();
}

    [My database looks like this][1]

【问题讨论】:

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


【解决方案1】:

试试这个方法。 假设 AdminOrders.class 是您的模型类。

{
    FirebaseRecyclerAdapter<AdminOrders, AdminNewOrdersActivity.AdminOrderViewHolder> adapter;

    FirebaseRecyclerOptions<AdminOrders> options =
                    new FirebaseRecyclerOptions.Builder<AdminOrders>()
            .setQuery(shippedOrdersRef.orderByChild("state").equalTo("shipped"), AdminOrders.class)
            .build();

    adapter = new FirebaseRecyclerAdapter<Products_Model, OrderProductsFragment.AdminOrderViewHolder>(options){
          @SuppressLint("SetTextI18n")
                @Override
                protected void onBindViewHolder(@NonNull final AdminNewOrdersActivity.AdminOrderViewHolder holder, final int position, @NonNull final AdminOrders model) {
        // Set your elements here


                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view, parent, false);
                return new AdminOrderViewHolder(view);
                }
    @NonNull
                @Override
                public AdminOrderViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
          //Set your view here
        }
     };
            recyclerView.setAdapter(adapter);
            adapter.startListening();
    }

如果我弄错了对齐方式和括号,请见谅。

【讨论】:

  • 我不明白如何使用这个查询以及在哪里。
  • 对不起。我更新了答案。如果我错过了一些值,请更改值,因为这是我用于当前项目的值。
【解决方案2】:

一种方法是这样的(你有一个 if 语句并将你想要的存储在一个数组中):

List<String> shipped = new ArrayList<>();

shippedOrdersRef = FirebaseDatabase.getInstance().getReference().child("Orders");
shippedOrdersRef.addValueEventListener(new ValueEventListener()
   @Override
   public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
       for(DataSnapshot ds : dataSnapshot.getChildren()){
           Orders order = ds.getValue(Orders.class);
           if(order.getState().equals("shipped")) shipped.add(order.getState());
       }
    });

其中 Orders 是带有订单构造函数的类的名称。

另一种更快的方法是:

shippedOrdersRef = FirebaseDatabase.getInstance().getReference().child("Orders");
shippedOrdersRef.orderByChild("state").equalTo("shipped").addValueEventListener(new ValueEventListener()
   @Override
   public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
      DataSnapshot firstChild = dataSnapshot.getChildren().iterator().next();
      //your wanted value is firstChild.getKey()
   });

Here 是一个有用的链接。

希望我能帮上忙!

【讨论】:

  • 我想用第二种方式来做,那么我应该在哪里添加这个代码在 recyclerview 适配器中或在哪里?
  • 这取决于你想在哪个屏幕上显示它们。你说你想要在另一个活动中发货的订单,所以把它放在你的另一个类(活动)中。上面的代码是你要在其中采取发货状态的活动吗?
  • 在 'shippedOrdersRef = FirebaseDatabase.getInstance().getReference().child("Orders")' 旁边添加 'orderByChild("state").equalTo("shipped")'
猜你喜欢
  • 2018-02-25
  • 2017-08-25
  • 1970-01-01
  • 2019-04-07
  • 2018-05-29
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多