Итерация по объектам в объектах в Firebase с использованием FirebaseRecyclerAdapter - PullRequest
0 голосов
/ 19 февраля 2020

Я немного прочитал о своей проблеме, и в то время как многие люди указывали на использование DataSnapshot.forEach() для решения моей проблемы, я хотел бы знать, возможно ли изменить мой запрос внутри FirebaseRecyclerAdapter, чтобы он соответствовал моим потребностям.

Это структура, которая у меня сейчас есть, где Request может иметь 1 или много Orders. Каждый Order поставляется со своим набором значений, таких как restaurantID. Я хочу в основном перебрать все эти запросы и отображать только те, которые имеют заказ с определенным restaurantID.

В моем приложении пользователь входит в систему и имеет значение restaurantID. Я хочу показывать внутри моего RecyclerView только те заказы, которые связаны с этой учетной записью на основе этого значения.

Ниже приведен код. Я попытался сделать несколько забавных вещей в populateViewHolder(), чтобы исправить это с ordersForThisRestaurant, но это не совсем сработало. Я был бы рад любой помощи по этому вопросу, я застрял и не мог добиться какого-либо прогресса в течение некоторого времени. Было бы здорово продвинуться!

СПАСИБО!

OrderStatus. java

public class OrderStatus extends AppCompatActivity {

    RecyclerView recyclerView;
    RecyclerView.LayoutManager layoutManager;

    FirebaseRecyclerAdapter<Request, OrderViewHolder> adapter;

    FirebaseDatabase database;
    DatabaseReference requests;

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

        //Initialize the Firebase database.
        database = FirebaseDatabase.getInstance();
        requests = database.getReference("Requests");

        recyclerView = (RecyclerView) findViewById(R.id.recyclerOrder);
        recyclerView.setHasFixedSize(true);
        layoutManager = new GridLayoutManager(this, 2);
        recyclerView.setLayoutManager(layoutManager);

        loadOrders();
    }


    private void loadOrders() {
        adapter = new FirebaseRecyclerAdapter<Request, OrderViewHolder>(
                Request.class,
                R.layout.order_layout,
                OrderViewHolder.class,
                requests
        ) {
            @Override
            protected void populateViewHolder(OrderViewHolder orderViewHolder, Request request, int i) {
                List<Order> activeOrders = request.getOrder();
                List<Order> ordersForThisRestaurant = new ArrayList<>();
                for(int pos=0; pos<activeOrders.size(); pos++) {
                    Order currentOrder = activeOrders.get(pos);
                    String restaurantID = currentOrder.getRestaurantID();
                    if(restaurantID.equals(Common.currentUser.getRestaurantID())) {
                        ordersForThisRestaurant.add(activeOrders.get(pos));
                    }
                }
                if(ordersForThisRestaurant.size() == 0) return;     //This means the request was not for this restaurant.

                orderViewHolder.orderID.setText(adapter.getRef(i).getKey());
                orderViewHolder.orderStatus.setText(Common.convertCodeToStatus(request.getStatus()));
                String orderMenu = "";

                for(int pos=0; pos<ordersForThisRestaurant.size(); pos++) {
                    String currentMenu = ordersForThisRestaurant.get(pos).getMenuName();
                    String currentQuantity = ordersForThisRestaurant.get(pos).getQuantity();
                    //orderMenu += currentMenu + " x" + currentQuantity + " | ";
                    if(pos != 0) {
                        orderMenu += "\n";
                    }
                    orderMenu += currentQuantity + " " + currentMenu;
                }

                orderViewHolder.orderMenu.setText(orderMenu);
                orderViewHolder.setItemClickListener(new ItemClickListener() {
                    @Override
                    public void onClick(View view, int position, boolean isLongClick) {
                        //Empty -> just to fix crash because of context menu
                    }
                });
            }
        };

        adapter.notifyDataSetChanged();
        recyclerView.setAdapter(adapter);

    }

OrderViewHolder. java

public class OrderViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnCreateContextMenuListener{

    public TextView orderID;
    public TextView orderStatus;
    public TextView orderMenu;

    private ItemClickListener itemClickListener;

    public OrderViewHolder(@NonNull View itemView) {
        super(itemView);
        orderID = (TextView) itemView.findViewById(R.id.orderID);
        orderStatus = (TextView) itemView.findViewById(R.id.orderStatus);
        orderMenu = (TextView) itemView.findViewById(R.id.orderMenu);
        itemView.setOnClickListener(this);
        itemView.setOnCreateContextMenuListener(this);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        menu.setHeaderTitle("Select an action");
        menu.add(0, 0, getAdapterPosition(), "Update");
        menu.add(0, 1, getAdapterPosition(), "Delete");

    }

    public void setItemClickListener(ItemClickListener itemClickListener) {
        this.itemClickListener = itemClickListener;
    }

    @Override
    public void onClick(View v) {
        //No onClick => otherwise it throws an error.
        //itemClickListener.onClick(v, getAdapterPosition(), false);
    }

}

Запрос. java

public class Request {
    private String email;
    private String name;
    private List<Order> order;
    private String restriction;
    private String status;

    public Request() { }

    public Request(String email, String name, String restriction, List<Order> order) {
        this.email = email;
        this.name = name;
        this.restriction = restriction;
        this.order = order;
        this.status = "0";          //0: Placed. 1: Ready. 2: Picked up.
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }
    public String getRestriction() {
        return restriction;
    }
    public void setRestriction(String restriction) {
        this.restriction = restriction;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public List<Order> getOrder() {
        return order;
    }
    public void setOrder(List<Order> order) {
        this.order = order;
    }
}

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Если вы хотите получить данные в соответствии с resturantID, то вам нужно сделать следующее:

 requests = database.getReference("Requests").child("1582094998206").child("order");
 Query resturantQuery = requests.orderByChild("restaurantID").equalTo("01");

Затем использовать resturantQuery внутри FirebaseRecyclerAdapter.

0 голосов
/ 20 февраля 2020

Я в конце концов нашел решение. Продолжая этот маршрут с текущей схемой базы данных, я не выглядел как жизнеспособный вариант, поэтому я работал над реструктуризацией, как это выглядело. Используя обычный .orderByChild(restaurantID).equalTo("01") работал оттуда.

Что-то, что я собирался изучить, если это не сработало, - это создание собственного Adapter & ViewHolder и поиск способа получения необходимых данных с помощью Firebase ValueListener.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...