Reputation: 175
I have an android app in which chefs can see a list of customer orders. Each order has it's own button, which when clicked updates the visibility of this order in a database. This code works well.
However, upon clicking the button, I would like it if the chef's view automatically updated so that the order was no longer on their screen. Currently, they have to go back and reload the screen for it to disappear. Does anyone have any suggestions? I had looked into reloading the activity but as the functionality of the clear button is in the adapter class and not the chef activity this didn't work.
Here is the chef class:
public class ChefScreen extends AppCompatActivity {
ListView listView;
List<ChefOrderList> listOrders;
Button requestWaiter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chef_screen);
listView = findViewById(R.id.list_chef_orders);
listOrders = new ArrayList<>();
requestWaiter = findViewById(R.id.btnChefToWaiter);
requestWaiter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getWaiter();
}
});
displayOrders();
}
private void displayOrders(){
String url = "hidden";
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject obj = new JSONObject(response);
JSONArray array = obj.getJSONArray("orders");
for (int i = 0; i < array.length(); i++) {
final JSONObject orderObj = array.getJSONObject(i);
ChefOrderList c = new ChefOrderList(orderObj.getString("menu_item_name"), orderObj.getString("item_type"), orderObj.getString("order_date_time"),
orderObj.getInt("quantity_ordered"), orderObj.getInt("order_id"), orderObj.getInt("table_id"));
listOrders.add(c);
}
ChefOrderAdapter adapter = new ChefOrderAdapter(listOrders, getApplicationContext());
listView.setAdapter(adapter);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(ChefScreen.this, "Oops!" +error.toString(), Toast.LENGTH_LONG).show();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("menuid", "0");
return params;
}
};
MySingleton.getInstance(this).addToRequestQueue(stringRequest);
}
}
The Model class:
public class ChefOrderList {
String Name, Type, Date;
int Qty, Order, Table;
public ChefOrderList(String name, String type, String date, int qty, int order, int table) {
Name = name;
Type = type;
Date = date;
Qty = qty;
Order = order;
Table = table;
}
public String getDate() {
return Date;
}
public String getName() {
return Name;
}
public String getType() {
return Type;
}
public int getQty() {
return Qty;
}
public int getOrder() {
return Order;
}
public int getTable() {
return Table;
}
}
and finally the adapter! The method completeOrder is the one executed upon clicking the clear order button.
public class ChefOrderAdapter extends ArrayAdapter<ChefOrderList> {
private List<ChefOrderList> chefOrderList1;
private Context context;
private Button completeOrder;
public ChefOrderAdapter(List<ChefOrderList> M, Context C){
super(C, R.layout.listcheforders, M);
this.chefOrderList1 = M;
this.context = C;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = LayoutInflater.from(context);
View view = layoutInflater.inflate(R.layout.listcheforders,null,true);
TextView orderNumber = view.findViewById(R.id.tvOrderNumber);
TextView itemType = view.findViewById(R.id.tvItemType);
TextView itemName = view.findViewById(R.id.tvItemName);
TextView orderQuantity = view.findViewById(R.id.tvItemQty);
TextView orderTime = view.findViewById(R.id.tvDateTime);
TextView table = view.findViewById(R.id.tvTable);
completeOrder = view.findViewById(R.id.btnComplete);
ChefOrderList chefOrderList = chefOrderList1.get(position);
itemName.setText(chefOrderList.getName());
orderQuantity.setText("Qty: " +chefOrderList.getQty());
if(position>0){
ChefOrderList prevChefOrderList = chefOrderList1.get(position-1);
if(chefOrderList.getOrder() != (prevChefOrderList.getOrder())){
orderNumber.setText("Order: " +chefOrderList.getOrder());
orderTime.setText(chefOrderList.getDate());
table.setText("Table: " +chefOrderList.getTable());
completeOrder.setVisibility(View.VISIBLE);
completeOrder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
completeOrder(position);
}
});
}
if(!chefOrderList.getType().equals(prevChefOrderList.getType())){
itemType.setText(chefOrderList.getType());
}
} else {
itemType.setText(chefOrderList.getType());
orderNumber.setText("Order: " +chefOrderList.getOrder());
orderTime.setText(chefOrderList.getDate());
table.setText("Table: " +chefOrderList.getTable());
completeOrder.setVisibility(View.VISIBLE);
completeOrder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
completeOrder(position);
}
});
}
return view;
}
private void completeOrder(final int position){
String url = "hidden";
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if(response.trim().equals("success")){
Toast.makeText(context, "Order completed!", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(context, "Clear order failed!", Toast.LENGTH_LONG).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(context, "Error!" +error.toString(), Toast.LENGTH_LONG).show();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("orderid", String.valueOf(chefOrderList1.get(position).getOrder()));
return params;
}
};
MySingleton.getInstance(context).addToRequestQueue(stringRequest);
}
}
Upvotes: 1
Views: 42
Reputation: 1498
as I understood from this line
I would like it if the chef's view automatically updated so that the order was no longer on their screen.
the update in the database based on the customer action; such as close the order or cancel it. right?
I think you should use Socket or Push Notification.
let's go with push notification "FCM"
when the customer makes an action that affects the order in the database, you should send a notification for the chef using his token, and in the application handle the notification to recall the
displayOrders
method
and use recyclerview.notifiDataSetChange();
Otherwise, you should reconnect to the database to check if there is any change happen. "not recommended"
Upvotes: 1