Я немного прочитал о своей проблеме, и в то время как многие люди указывали на использование 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;
}
}