导图社区 安卓餐厅点餐项目
安卓练手小项目,编程,比赛,读书笔记,it,技术,安卓,Android,Studio等。可供您参考学习。
编辑于2021-06-13 14:58:36餐厅点餐项目
类的关系,页面的关系
类
主页类
菜单碎片类
菜品类名列表项适配器
菜品类
菜品表控制类
菜品展示列表项适配器
菜品展示列表项适配器
数据库类
菜品类
菜品表控制类
订单碎片类
订单菜品展示列表项适配器
数据库类
菜品类
菜品表控制类
碎片适配器
数据库类
页面
主页布局
菜单碎片页面布局
菜品类名列表项布局
菜品展示列表项布局
订单碎片布局
订单菜品列表项布局
两个按钮的切换配置
类的作用
类
主页类
菜单碎片类
菜品类名列表项适配器
菜品类
菜品表控制类
菜品展示列表项适配器
作用
点击菜品类名,改变背景颜色,并还原上一次菜品类名列表项的背景颜色
点击菜品类名,菜品展示列表更新对应的菜品数据
菜品展示列表项适配器
数据库类
菜品类
菜品表控制类
作用
模拟菜品类名数据
查询对应归类的菜品数据
订单碎片类
订单菜品展示列表项适配器
数据库类
菜品类
菜品表控制类
碎片适配器
数据库类
类的作用
初始化数据库
初始化碎片适配器
滑动监听
点击监听
特殊类的构建
碎片控制类
碎片适配器
列表项适配器
数据库类
代码
java
B01_orderActivity
package com.spoto.a09_xiangmu1; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.viewpager.widget.ViewPager; import android.os.Bundle; import android.widget.ImageView; import android.widget.RadioGroup; import java.util.ArrayList; import java.util.List; public class B01_orderActivity extends AppCompatActivity { // 声明页面控件对象 private ImageView ivLogo; private ViewPager viewPager; private RadioGroup rgGroup; // 声明存放所有碎片的集合 List<Fragment> listFragment; // 声明菜单碎片页面对象 B02_menuFragment mf; // 声明已点碎片页面对象 B03_orderFragment of; // 声明碎片页面适配器 B04_myFragmentAdapter mfa; // 数据库对象 B08_MyHelper myHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.b01_activity_order); // 数据库对象初始化,建库,建表 myHelper = new B08_MyHelper(this); // 刷新 myHelper.getReadableDatabase(); initView(); } // 控件初始化 private void initView(){ // 控件初始化 ivLogo = findViewById(R.id.iv_logo); viewPager = findViewById(R.id.viewpager); rgGroup = findViewById(R.id.rg_group); // 碎片页面初始化 mf = new B02_menuFragment(myHelper); of = new B03_orderFragment(); // 碎片集合初始化 listFragment = new ArrayList<>(); // 碎片页面对象添加到集合 listFragment.add(mf); listFragment.add(of); // 碎片页面适配器初始化 // 传入两个参数,当前activity的fragment管理器,存放所有fragment的集合 mfa = new B04_myFragmentAdapter(getSupportFragmentManager(),listFragment); // 碎片页面适配器设置给viewpager控件 viewPager.setAdapter(mfa); // 给viewpager控件添加滑动监听(碎片页面滑动联动底部按钮) viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener(){ @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { // 当fragment切换界面的时候,底部导航也要跟着切换 switch (position){ case 0:// listFragment[0]碎片页面(菜单页面)绑定的菜单按钮 rgGroup.check(R.id.rbtn_menu); break; case 1:// listFragment[1]碎片页面(已点食品页面)绑定的已点菜品按钮 rgGroup.check(R.id.rbtn_order); break; } } @Override public void onPageScrollStateChanged(int state) { } }); // 给底部按钮添加点击监听(点击按钮,切换对应的碎片页面) rgGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId){ // 0 = 菜单按钮id = 菜单碎片页面id case R.id.rbtn_menu: viewPager.setCurrentItem(0); break; // 1 = 已点按钮id = 已点碎片页面id case R.id.rbtn_order: viewPager.setCurrentItem(1); break; } } }); } }
B02_menuFragment
package com.spoto.a09_xiangmu1; import android.os.Bundle; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.List; /** * A simple {@link Fragment} subclass. */ public class B02_menuFragment extends Fragment {// 菜单碎片控制类 // 声明 // 类名循环列表对象 RecyclerView rvClassify; // 类名列表项适配器 B05_classifyTvAdapter classifyTvAdapter; // 食品循环列表对象 RecyclerView rvFoods; // 食品循环列表项适配器 B06_foodsTvAdapter foodsTvAdapter; // 数据容器 , // 所有食品类名 List<String> classifyList; // 所有食品对象集合 List<B07_food> foodsList; // 数据库对象 B08_MyHelper myHelper; // 菜品表对象 B09_foodDao foodDao; // 构造函数 public B02_menuFragment(B08_MyHelper myHelper) { this.myHelper = myHelper; // Required empty public constructor //------------ 模拟菜品类名列表集合数据 --------------- // 数据容器初始化 classifyList = new ArrayList<>(); // 模拟数据 classifyList.add("火爆热销"); classifyList.add("无辣不欢"); classifyList.add("店长推荐"); //-------------------- 模拟菜品对象集合数据 ----------------------- // 菜品对象集合初始化 foodsList = new ArrayList<>(); // 模拟数据 // foods.add(new B07_food(0,"菜品1",25.0,0,"p1.jpg")); // foods.add(new B07_food(0,"菜品2",25.0,0,"p2.jpg")); // foods.add(new B07_food(0,"菜品3",25.0,0,"p3.jpg")); // foods.add(new B07_food(0,"菜品4",25.0,0,"p4.jpg")); // foods.add(new B07_food(0,"菜品5",25.0,0,"p5.jpg")); // 从数据库拿数据 } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 菜单碎片页面对象 View view = inflater.inflate(R.layout.b02_fragment_menu, container, false); //--------------- 菜品列表 ------------------- // 表对象初始化 foodDao = new B09_foodDao(myHelper); // 默认查询 火爆热销 foodsList = foodDao.findFoodByClassify("火爆热销"); // 食品循环列表对象 rvFoods = view.findViewById(R.id.rv_foods); // 设置布局管理器 // 网格布局,两行 rvFoods.setLayoutManager(new GridLayoutManager(this.getContext(),2)); // 菜品对象集合设置给菜品列表项适配器 foodsTvAdapter = new B06_foodsTvAdapter(foodsList,this.getContext()); // 适配器设置给菜品列表对象 rvFoods.setAdapter(foodsTvAdapter); //-------------- 菜品类名列表 -------------------- // 列表对象绑定 // 类名循环列表对象 rvClassify = view.findViewById(R.id.rv_classify); // 数据传递 // 设置布局管理器 // 线性布局管理器 rvClassify.setLayoutManager(new LinearLayoutManager(this.getActivity())); // 菜品类名数据集合设置给列表项适配器 // activity // 菜品展示适配器设置给菜品类名列表项适配器 // 菜品表操控对象 classifyTvAdapter = new B05_classifyTvAdapter(classifyList,this.getActivity(),foodsTvAdapter,foodDao); // 适配器设置给列表对象 rvClassify.setAdapter(classifyTvAdapter); // Inflate the layout for this fragment return view; } }
B03_orderFragment
package com.spoto.a09_xiangmu1; import android.os.Bundle; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.List; /** * A simple {@link Fragment} subclass. */ public class B03_orderFragment extends Fragment {// 订单碎片控制类 // 订单列表对象 RecyclerView rvOrder; // 订单菜品集合 List<B07_food> foodList; // 订单菜品展示适配器对象 B10_orderRvAdapter orderRvAdapter; public B03_orderFragment() { // Required empty public constructor // 订单菜品集合初始化 foodList = new ArrayList<>(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.b03_fragment_order, container, false); // 控件绑定 rvOrder = view.findViewById(R.id.rv_order); // 列表布局管理器(列表布局) rvOrder.setLayoutManager(new LinearLayoutManager(this.getActivity())); // 适配器初始化 orderRvAdapter = new B10_orderRvAdapter(foodList, this.getContext()); // 订单列表菜品控件对象设置适配器 rvOrder.setAdapter(orderRvAdapter); // Inflate the layout for this fragment return view; } }
B04_myFragmentAdapter
package com.spoto.a09_xiangmu1; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; import java.util.List; public class B04_myFragmentAdapter extends FragmentPagerAdapter {// 碎片页面适配器 // 参数容器 List<Fragment> list; // 利用构造函数,传递参数 public B04_myFragmentAdapter(FragmentManager fm,List<Fragment> list) { super(fm); this.list = list; } @Override public Fragment getItem(int position) { // 集合内容 return list.get(position); } @Override public int getCount() { // 集合大小 return list.size(); } }
B05_classifyTvAdapter
package com.spoto.a09_xiangmu1; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Color; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; import java.util.List; // 类名列表项适配器 public class B05_classifyTvAdapter extends RecyclerView.Adapter<B05_classifyTvAdapter.ViewHolder> { // 所有分类的类名集合(传参) List<String> classifyList; // 上下文对象(传参) Context context; // 上一次列表项的视图容器 View viewPre; // 菜品类名适配器根据菜品类名查询数据库得到数据设置到菜品列表项适配器中(传参) B06_foodsTvAdapter foodsTvAdapter; // 菜品表操控对象(传参) B09_foodDao foodDao; // 构造函数,传递参数 public B05_classifyTvAdapter(List<String> classifyList, Context context, B06_foodsTvAdapter foodsTvAdapter,B09_foodDao foodDao) { this.classifyList = classifyList; this.context = context; this.viewPre = viewPre; this.foodsTvAdapter = foodsTvAdapter; this.foodDao = foodDao; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { //在 onCreateViewHolder 中绑定列表项的页面 View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.b04_classify_item, parent, false); return new ViewHolder(view); } // 设置内容展示 @Override public void onBindViewHolder(@NonNull ViewHolder holder, final int position) { // 设置列表项第一次默认选中第一个 if (position == 0){ holder.tvClassify.setBackgroundResource(R.color.colorBai); // 记录默认视图,以供颜色回改 viewPre = holder.tvClassify; } // 数据传递 // 数据展示 // list -> 类名列表项控件 holder.tvClassify.setText(classifyList.get(position)); // 列表项监听 holder.tvClassify.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Toast.makeText ( context, classifyList.get(position) , Toast.LENGTH_SHORT ).show(); // 对之前点击的列表项还原颜色 if (viewPre != null){ viewPre.setBackgroundResource(R.color.colorHui); } // 对点击的列表项颜色修改为白色 v.setBackgroundResource(R.color.colorBai); // 存储当前列表项的下标,以供下次颜色回改 viewPre = v; //--------------- 点击分类,菜品列表展示对应的类别的菜品 ---------------------- // 菜品对象数据容器 List<B07_food> foodList = new ArrayList<>(); // 数据库类名查询 foodList = foodDao.findFoodByClassify(classifyList.get(position)); // 将菜品对象集合数据设置给菜品展示适配器 foodsTvAdapter.setFoods(foodList); // 菜品展示适配器刷新 foodsTvAdapter.notifyDataSetChanged(); // 假设从数据库里查到最新的这种类别的菜品数据 // 所有菜品对象的容器 // List<B07_food> foods1 = new ArrayList<>(); // // // foods1.add(new B07_food(0,"菜品6",25.0,0,"p6.jpg")); // foods1.add(new B07_food(0,"菜品7",25.0,0,"p7.jpg")); // // List<B07_food> foods2 = new ArrayList<>(); // foods2.add(new B07_food(0,"菜品8",25.0,0,"p8.jpg")); // foods2.add(new B07_food(0,"菜品9",25.0,0,"p9.jpg")); // // List<B07_food> foods3 = new ArrayList<>(); // // foods3.add(new B07_food(0,"菜品10",25.0,0,"p10.jpg")); // foods3.add(new B07_food(0,"菜品11",25.0,0,"p11.jpg")); //------------------------------------------- // 点击分类按钮,从数据库中得到对应类型的菜品对象数据 // 菜品类名列表项适配器(数据) -> 菜品展示列表项适配器 // 菜品展示列表项适配器数据更新 // switch (position){ // // 0 = 菜单按钮id = 菜单碎片页面id // case 0: // foodsTvAdapter.setFoods(foods1); // foodsTvAdapter.notifyDataSetChanged(); // break; // // 1 = 已点按钮id = 已点碎片页面id // case 1: // foodsTvAdapter.setFoods(foods2); // foodsTvAdapter.notifyDataSetChanged(); // break; // case 2: // foodsTvAdapter.setFoods(foods3); // foodsTvAdapter.notifyDataSetChanged(); // break; // } //-------------------------------------------- } }); } @Override public int getItemCount() { // 返回数据条数 return classifyList.size(); } public class ViewHolder extends RecyclerView.ViewHolder{ // 类名列表对象,rvClassify // 类名列表项对象,tv TextView tvClassify; public ViewHolder(@NonNull View itemView) { super(itemView); tvClassify = itemView.findViewById(R.id.tv_classify); } } }
B06_foodsTvAdapter
package com.spoto.a09_xiangmu1; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.io.IOException; import java.io.InputStream; import java.util.List; public class B06_foodsTvAdapter extends RecyclerView.Adapter<B06_foodsTvAdapter.ViewHolder> { // 所有菜品对象的容器(接收) List<B07_food> foods; Context context; public B06_foodsTvAdapter(List<B07_food> foods, Context context) { this.foods = foods; this.context = context; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { //在 onCreateViewHolder 中绑定列表项的页面 View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.b05_foods_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { // 设置菜品信息 // 设置菜品图片 // 读取流对象 InputStream is = null; ; try{ // 开始读取 is = context.getResources().getAssets().open(foods.get(position).getPic()); // 转换 Bitmap bitmap = BitmapFactory.decodeStream(is); // 设置给控件 holder.ivDishPic.setImageBitmap(bitmap); }catch (IOException e){ e.printStackTrace(); } // 设置菜品名称 holder.tvDishName.setText(foods.get(position).getFoodName()); // 设置价格 holder.tvDishPrice.setText(String.valueOf(foods.get(position).getFoodPrice())); // 设置数量 holder.tvDishCount.setText(String.valueOf(foods.get(position).getFoodCount())); // 订单菜品加控件设置 holder.ivDishAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 点击增加 // 订单菜品数量加一 // String -> int int count = Integer.parseInt(holder.tvDishCount.getText().toString()); count++; holder.tvDishCount.setText(String.valueOf(count)); } }); // 订单菜品减控件设置 holder.ivDishMinus.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 点击增加 // 订单菜品数量加一 // String -> int int count = Integer.parseInt(holder.tvDishCount.getText().toString()); count--; holder.tvDishCount.setText(String.valueOf(count)); } }); } @Override public int getItemCount() { return foods.size(); } public class ViewHolder extends RecyclerView.ViewHolder{ // 类名列表对象,rvClassify // 食品展示列表项控件声明 // 食品图片展示控件 ImageView ivDishPic; // 食品名称展示控件 TextView tvDishName; // 食品价格展示控件 TextView tvDishPrice; // 食品订购数量展示控件 TextView tvDishCount; // 加,减图片控件 ImageView ivDishAdd; ImageView ivDishMinus; public ViewHolder(@NonNull View itemView) { super(itemView); ivDishPic = itemView.findViewById(R.id.iv_dish_pic); tvDishName = itemView.findViewById(R.id.tv_dish_name); tvDishPrice = itemView.findViewById(R.id.tv_dish_price); tvDishCount = itemView.findViewById(R.id.tv_dish_count); ivDishAdd = itemView.findViewById(R.id.iv_dish_add); ivDishMinus = itemView.findViewById(R.id.iv_dish_minus); } } public List<B07_food> getFoods() { return foods; } public void setFoods(List<B07_food> foods) { this.foods = foods; } }
B07_food
package com.spoto.a09_xiangmu1; public class B07_food { private int id; private String foodName;// 菜品名称 private double foodPrice;// 价格 private int foodCount;// 已点数量 private String pic;// 菜品图片名称 public B07_food() { } public B07_food(int id, String foodName, double foodPrice, int foodCount, String pic) { this.id = id; this.foodName = foodName; this.foodPrice = foodPrice; this.foodCount = foodCount; this.pic = pic; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getFoodName() { return foodName; } public void setFoodName(String foodName) { this.foodName = foodName; } public double getFoodPrice() { return foodPrice; } public void setFoodPrice(double foodPrice) { this.foodPrice = foodPrice; } public int getFoodCount() { return foodCount; } public void setFoodCount(int foodCount) { this.foodCount = foodCount; } public String getPic() { return pic; } public void setPic(String pic) { this.pic = pic; } }
B08_MyHelper
package com.spoto.a09_xiangmu1; import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class B08_MyHelper extends SQLiteOpenHelper { // context 【activity对象】 public B08_MyHelper(Context context) { // 数据库命名 super(context, "data.db", null, 1); } @Override public void onCreate(SQLiteDatabase db) { // 建表sql,【id,名称,价格,数量,图片,归类】 String sql = "create table tbl_food(id integer primary key autoincrement ,food_name varchar(100)," + "food_price float, food_count interger, food_pic varchar(50), food_classify varchar(10))"; // 执行 db.execSQL(sql); // 插入菜品数据 for (int i = 1; i < 17; i++) { // 数据容器(表的一行) ContentValues cv = new ContentValues(); // 给对应的字段名添加数据 cv.put("food_name","菜品"+i); cv.put("food_price",25.0); cv.put("food_count",0); cv.put("food_pic","p"+i+".jpg"); if (i%2==0){ cv.put("food_classify","无辣不欢"); }else { cv.put("food_classify","火爆热销"); } // 插入数据 db.insert("tbl_food",null,cv); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
B09_foodDao
package com.spoto.a09_xiangmu1; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import java.util.ArrayList; import java.util.List; public class B09_foodDao { // 数据库对象 B08_MyHelper myHelper; public B09_foodDao(B08_MyHelper myHelper) { this.myHelper = myHelper; } // 根据归类查询菜品 public List<B07_food> findFoodByClassify(String classify) { // 数据库读取器 SQLiteDatabase db = myHelper.getReadableDatabase(); // 查询 // 7个 // 那张表,哪个字段,查询条件,查询参数【必须是字符串数组形式】 Cursor cursor = db.query("tbl_food", null, "food_classify=?", new String[]{classify}, null, null, null, null); // 菜品对象集合 List<B07_food> list = new ArrayList<>(); // 循环填充,每次循环,填充好一个菜品对象 while(cursor.moveToNext()){ // 菜品对象容器初始化 B07_food food = new B07_food(); // 表的第一个字段设置给菜品对象 food.setId(cursor.getInt(0)); food.setFoodName(cursor.getString(1)); food.setFoodPrice(cursor.getDouble(2)); food.setFoodCount(cursor.getInt(3)); food.setPic(cursor.getString(4)); list.add(food); } return list; } // 菜品订购数量保存 public void updateCount(){ } // 查询 count > 0 的菜品 = 已点菜品 public List<B07_food> findFoodByCount(){ List<B07_food> list = new ArrayList<>(); B07_food b07_food = new B07_food(); list.add(b07_food); return list; } }
B10_orderRvAdapter
package com.spoto.a09_xiangmu1; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.constraintlayout.solver.widgets.ConstraintAnchor; import androidx.recyclerview.widget.RecyclerView; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; public class B10_orderRvAdapter extends RecyclerView.Adapter<B10_orderRvAdapter.ViewHolder> { // (接收) List<B07_food> foodList; // 图片资源包对象(接收) Context context; public B10_orderRvAdapter(List<B07_food> foodList, Context context) { this.foodList = foodList; this.context = context; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { //在 onCreateViewHolder 中绑定列表项的页面 View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.b06_order_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { // 设置图片展示 InputStream is = null; try{ // 开始读取 is = context.getResources().getAssets().open(foodList.get(position).getPic()); // 转换 Bitmap bitmap = BitmapFactory.decodeStream(is); // 设置给控件 holder.ivLogo.setImageBitmap(bitmap); }catch (IOException e){ e.printStackTrace(); } // 设置菜品名称 holder.tvFoodName.setText(foodList.get(position).getFoodName()); // 设置价格 holder.tvFoodPrice.setText(String.valueOf(foodList.get(position).getFoodPrice())); // 设置数量 holder.tvFoodCount.setText(String.valueOf(foodList.get(position).getFoodCount())); // 订单菜品加控件设置 holder.ivOrderAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 点击增加 // 订单菜品数量加一 // String -> int int count = Integer.parseInt(holder.tvFoodCount.getText().toString()); count++; holder.tvFoodCount.setText(String.valueOf(count)); } }); // 订单菜品减控件设置 holder.ivOrderAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 点击增加 // 订单菜品数量加一 // String -> int int count = Integer.parseInt(holder.tvFoodCount.getText().toString()); count--; holder.tvFoodCount.setText(String.valueOf(count)); } }); } @Override public int getItemCount() { return foodList.size(); } public class ViewHolder extends RecyclerView.ViewHolder{ // 订单菜品图片展示控件对象 ImageView ivLogo; // 订单菜品名称展示控件对象 TextView tvFoodName; // 订单菜品价格展示控件对象 TextView tvFoodPrice; // 订单菜品数量展示控件对象 TextView tvFoodCount; // 订单菜品加减控件对象 ImageView ivOrderAdd; ImageView ivOrderMinus; public ViewHolder(@NonNull View itemView) { super(itemView); ivLogo = itemView.findViewById(R.id.iv_logo); tvFoodName = itemView.findViewById(R.id.tv_name); tvFoodPrice = itemView.findViewById(R.id.tv_dish_price); tvFoodCount = itemView.findViewById(R.id.tv_dish_count); ivOrderAdd = itemView.findViewById(R.id.iv_order_add); ivOrderMinus = itemView.findViewById(R.id.iv_order_minus); } } }
layout
b01_activity_order.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".B01_orderActivity" android:orientation="vertical"> <!-- 头部图片展示 --> <!-- 横幅展示 --> <ImageView android:id="@+id/iv_logo" android:layout_width="match_parent" android:layout_height="120dp" android:scaleType="fitXY" android:src="@mipmap/logo"/> <androidx.viewpager.widget.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_weight="1" android:layout_height="0dp"> </androidx.viewpager.widget.ViewPager> <!-- 底部的两个按钮 --> <RadioGroup android:id="@+id/rg_group" android:layout_width="match_parent" android:layout_height="70dp" android:orientation="horizontal" android:background="#fff"> <!-- 菜单按钮 --> <RadioButton android:id="@+id/rbtn_menu" android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:checked="true" android:drawableTop="@drawable/menu_selector" android:button="@null" android:text="菜单" android:textSize="16sp" android:textAlignment="center"/> <!-- 订单按钮 --> <RadioButton android:id="@+id/rbtn_order" android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:drawableTop="@drawable/order_selector" android:button="@null" android:text="已点" android:textSize="16sp" android:textAlignment="center"/> </RadioGroup> </LinearLayout>
b02_fragment_menu.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".B02_menuFragment"> <!-- 菜单碎片页面 --> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_classify" android:layout_width="100dp" android:layout_height="match_parent"/> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_foods" android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent"/> </LinearLayout> </FrameLayout>
b03_fragment_order.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".B03_orderFragment"> <!-- 订单碎片页面 --> <!-- 头部图片展示 --> <!-- TODO: Update blank fragment layout --> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_order" android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent"/> </FrameLayout>
b04_classify_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#dddddd" android:orientation="vertical" > <!-- 类名列表项布局 --> <!-- 类名列表项文本展示 --> <TextView android:id="@+id/tv_classify" android:layout_width="match_parent" android:layout_height="50dp" android:textSize="20sp" android:gravity="center" android:text="无辣不欢" android:textColor="#000"/> <View android:layout_width="match_parent" android:layout_height="2dp" android:background="#666666" /> </LinearLayout>
b05_foods_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="150dp" android:background="#eeeeee" android:orientation="vertical"> <!-- 食品图片展示 --> <ImageView android:id="@+id/iv_dish_pic" android:scaleType="fitXY" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="6" android:src="@mipmap/shuizhuniurou"/> <!-- 食品名称展示 --> <TextView android:id="@+id/tv_dish_name" android:layout_width="match_parent" android:gravity="center" android:layout_height="0dp" android:layout_weight="1" android:text="水煮牛肉" android:textColor="#000" android:textSize="16sp"/> <!-- 食品价格,数量展示 --> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:gravity="center" android:layout_weight="1"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="12sp" android:text="价格:"/> <TextView android:id="@+id/tv_dish_price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="12sp" android:text="25.00元"/> <ImageView android:id="@+id/iv_dish_minus" android:layout_width="15dp" android:layout_height="15dp" android:layout_marginLeft="5dp" android:src="@mipmap/minus"/> <TextView android:id="@+id/tv_dish_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="12sp" android:text="0" android:layout_marginLeft="5dp"/> <ImageView android:id="@+id/iv_dish_add" android:layout_width="15dp" android:layout_height="15dp" android:layout_marginLeft="5dp" android:src="@mipmap/add"/> </LinearLayout> </LinearLayout>
b06_order_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/iv_logo" android:layout_width="100dp" android:layout_height="100dp" android:scaleType="fitXY" android:src="@mipmap/shuizhuniurou"/> <LinearLayout android:layout_width="0dp" android:layout_weight="2" android:paddingLeft="10dp" android:paddingRight="10dp" android:orientation="vertical" android:layout_height="100dp"> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:textColor="#000" android:text="水煮牛肉"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#333333" android:textStyle="italic" android:text="简介:"/> <TextView android:id="@+id/tv_intro" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:text="很好吃。。。。"/> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_weight="1" android:gravity="center_vertical" android:layout_height="100dp"> <ImageView android:id="@+id/iv_order_minus" android:layout_width="30dp" android:layout_height="30dp" android:src="@mipmap/minus"/> <TextView android:id="@+id/tv_order_num" android:textSize="20sp" android:gravity="center_horizontal" android:layout_width="30dp" android:layout_height="wrap_content" android:text="1"/> <ImageView android:id="@+id/iv_order_add" android:layout_width="30dp" android:layout_height="30dp" android:src="@mipmap/add"/> </LinearLayout> </LinearLayout>
drawable
menu_selector.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 菜单按钮的两种状态图片切换 --> <!-- 已选按钮选中状态展示的图片 --> <item android:state_checked="true" android:drawable="@mipmap/menu_fill"/> <!-- 设置未选中状态展示的图片 --> <item android:drawable="@mipmap/menu"/> </selector>
order_selector.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 订单按钮的两种状态图片切换 --> <!-- 设置选中状态展示的图片 --> <item android:state_checked="true" android:drawable="@mipmap/order_fill"/> <!-- 设置未选中状态展示的图片 --> <item android:drawable="@mipmap/order"/> </selector>
依赖
列表展示控件依赖
implementation 'androidx.recyclerview:recyclerview:1.1.0-alpha01'
主题