Android网络编程之一个Android下菜单系统模块的实现(客户端—添单功能(中部))
本篇来编写Activity中的操作,使用的仍然是OrderActivity。
本次编写的功能比较多,主要是要用于选择菜品,数量等信息后,将其填入下方ListView中显示出来,ListView中已点菜品可删除,最后下单。
OrderActivity准备各种组件等变量,绑定监听事件:

public class OrderActivity extends Activity { // 主界面组件 private Spinner tableNoSpinner = null; private EditText personNumEditText = null; private Button startBtn, addMealBtn, orderBtn; // 添菜功能弹出Dialog的自定义布局组件 private Spinner dishNameSpinner = null; private EditText dishNumEditText = null; private EditText dishRemarkEditText = null; // 下方显示已添加菜品的ListView及其adapter与填充数据List private ListView orderDetailListView = null; private SimpleAdapter orderDetailAdapter = null; private List<Map<String, Object>> orderDetailList = new ArrayList<Map<String, Object>>(); // 填充菜品下拉列表所需的数据 private List<Map<String, Object>> dishes = null; private Map<String, Object> dish = null; // 声明此菜单所属的主order编号 private String orderId = null; // 点击菜品下拉选单时返回的位置 private int selectedPosition; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.order); tableNoSpinner = (Spinner) findViewById(R.id.tableNoSpinner); personNumEditText = (EditText) findViewById(R.id.personNumEditText); startBtn = (Button) findViewById(R.id.startBtn); addMealBtn = (Button) findViewById(R.id.addMealBtn); orderBtn = (Button) findViewById(R.id.orderBtn); orderDetailListView = (ListView) findViewById(R.id.orderDetailListView); startBtn.setOnClickListener(new StartBtnListener()); addMealBtn.setOnClickListener(new AddMealBtnListener()); orderBtn.setOnClickListener(new OrderBtnListener()); // 给桌号下拉列表填值 setTableNoSpinner(); // 为了实现在添加菜品之后将其删除的功能,给orderDetailListView注册上下文菜单 this.registerForContextMenu(orderDetailListView); } private class StartBtnListener implements OnClickListener { @Override public void onClick(View v) { // 调用开桌方法 startOrder(); } } private class AddMealBtnListener implements OnClickListener { @Override public void onClick(View v) { // 调用添菜功能 addMeal(); } } private class OrderBtnListener implements OnClickListener { @Override public void onClick(View v) { // 确认下单功能 confirmDetails(); } }
复写为了实现删除已点菜品功能的上下文菜单两个方法:

/* * 给上下文菜单添加按钮 */ @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.setHeaderTitle("操作选项"); menu.add(Menu.NONE, Menu.FIRST + 1, 1, "删除"); } /* * 实现删除已点菜品 */ @Override public boolean onContextItemSelected(MenuItem item) { // 将菜单信息作如下转型, 可获取所长按的ListView中元素position AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); int position = info.position; // 判断点击了哪个操作选项 switch (item.getItemId()) { case Menu.FIRST + 1: // 从list中除去 this.orderDetailList.remove(position); // 通知adapter进行改变 this.orderDetailAdapter.notifyDataSetChanged(); Toast.makeText(OrderActivity.this, "成功删除", Toast.LENGTH_SHORT).show(); break; } return super.onContextItemSelected(item); }
开桌方法和填充桌号下拉列表方法在开桌功能篇中已经介绍,此处不再写出。
实现添菜功能的方法与填充菜品下拉单的方法:

/* * 实现添菜功能方法 */ private void addMeal() { // LayoutInflater将一个xml布局文件实例化为一个view对象 LayoutInflater inflater = LayoutInflater.from(OrderActivity.this); View view = inflater.inflate(R.layout.order_detail, null) ; // 实例化弹出dialog中所需的三个组件 dishNameSpinner = (Spinner) view.findViewById(R.id.dishNameSpinner); dishNumEditText = (EditText) view.findViewById(R.id.dishNumEditText); dishRemarkEditText = (EditText) view.findViewById(R.id.remarkEditText); // 调用填充菜品下拉单方法 setDishNameSpinner(dishNameSpinner); // 绑定监听事件,记录所选菜品位置 dishNameSpinner.setOnItemSelectedListener(new ChooseDishListener()); // 设置弹出Dialog Dialog dialog = new AlertDialog.Builder(OrderActivity.this) .setTitle("请点餐") // 设定自定义View .setView(view) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 填充下方ListView的具体实现方法 String dishName = OrderActivity.this.dishNameSpinner.getSelectedItem().toString(); String dishNum = OrderActivity.this.dishNumEditText.getText().toString(); String dishRemark = OrderActivity.this.dishRemarkEditText.getText().toString(); if (dishNum == null || dishNum.equals("")) { Toast.makeText(OrderActivity.this, "请输入数量", Toast.LENGTH_SHORT).show(); return; } Map<String, Object> map = dishes.get(OrderActivity.this.selectedPosition); map.put("dishName", dishName); map.put("dishNum", dishNum); map.put("dishRemark", dishRemark); orderDetailList.add(map); orderDetailAdapter = new SimpleAdapter(OrderActivity.this, orderDetailList, R.layout.order_detail_listview, new String[] {"dishName", "dishNum", "dishRemark"}, new int[] {R.id.dishNameText, R.id.dishNumText, R.id.dishRemarkText}); orderDetailListView.setAdapter(orderDetailAdapter); } }).setNegativeButton("取消", null) .show(); }

/* * 填充菜品下拉单的方法 */ private void setDishNameSpinner(Spinner dishNameSpinner) { // 调用dishNameQuery获取结果集 Cursor result = dishNameQuery(null) ; OrderActivity.this.startManagingCursor(result) ; dishes = new ArrayList<Map<String,Object>>() ; for (result.moveToFirst(); !result.isAfterLast(); result.moveToNext()) { dish = new HashMap<String,Object>() ; dish.put("_id", result.getInt(0)) ; dish.put("price", result.getInt(1)) ; dish.put("typeId", result.getInt(2)) ; dish.put("name", result.getString(3)) ; dish.put("pic", result.getString(4)) ; dish.put("remark", result.getString(5)) ; dishes.add(dish) ; } List<String> dishNameList = new ArrayList<String>(); for (int i = 0; i < dishes.size(); i++) { Map<String,Object> dish = dishes.get(i); dishNameList.add(dish.get("name") + ": ¥" + dish.get("price")); } ArrayAdapter<String> adapter = new ArrayAdapter<String>(OrderActivity.this, android.R.layout.simple_spinner_item, dishNameList); dishNameSpinner.setAdapter(adapter); } private Cursor dishNameQuery(String id) { if(id == null || "".equals(id)) { return super.getContentResolver().query(Menus.CONTENT_URI, null, null, null, Menus.SORT_ORDER); } else { return super.getContentResolver().query(Uri.withAppendedPath(Menus.CONTENT_URI,id), null, null, null, Menus.SORT_ORDER); } }
菜品下拉单的绑定方法(记录所选菜品位置):

/* * 菜品下拉单的绑定方法 */ private class ChooseDishListener implements OnItemSelectedListener { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // 记录所选位置 OrderActivity.this.selectedPosition = position; } @Override public void onNothingSelected(AdapterView<?> arg0) { } }
至此,添单功能已经编写完毕,效果如下: