主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" android:orientation="vertical" tools:context=".MainActivity"> <com.hjm.bottomtabbar.BottomTabBar android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/bottomtb" ></com.hjm.bottomtabbar.BottomTabBar> </LinearLayout>
购物车fragment布局
<?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="match_parent" android:orientation="vertical" > <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="9" android:id="@+id/rec" /> <LinearLayout android:layout_width="match_parent" android:orientation="horizontal" android:layout_weight="1" android:layout_height="wrap_content"> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/quan" android:layout_marginLeft="15dp" android:text="全选" /> <TextView android:layout_width="100dp" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:id="@+id/numm" /> <TextView android:layout_width="100dp" android:layout_height="wrap_content" android:layout_marginLeft="15dp" android:id="@+id/pay" /> </LinearLayout> </LinearLayout>
商家列表
<?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="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/shangjia" android:layout_marginLeft="15dp" /> <TextView android:id="@+id/titles" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" /> </LinearLayout> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/adapter_rec" /> </LinearLayout>
//商品的布局
<?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:orientation="horizontal" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginLeft="15dp" > <CheckBox android:layout_width="50dp" android:layout_height="50dp" android:layout_gravity="center" android:id="@+id/shangpin" /> <ImageView android:layout_width="100dp" android:layout_height="100dp" android:src="@mipmap/ic_launcher_round" android:id="@+id/img" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/price" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="25dp"/> </LinearLayout>
Api接口类
package bwie.com.lenovo.day19.api; public class Api { public static final String GOU_URL = "http://www.wanandroid.com/tools/mockapi/6523/restaurant-list"; }
bean类
package bwie.com.lenovo.day19.bean; import java.util.List; public class GouBean { private int status; private String message; private List<DataBean> data; public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class DataBean { public int id; public String name; public int restaurant_id; public String created_at; public int __v; public List<SpusBean> spus; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getRestaurant_id() { return restaurant_id; } public void setRestaurant_id(int restaurant_id) { this.restaurant_id = restaurant_id; } public String getCreated_at() { return created_at; } public void setCreated_at(String created_at) { this.created_at = created_at; } public int get__v() { return __v; } public void set__v(int __v) { this.__v = __v; } public List<SpusBean> getSpus() { return spus; } public void setSpus(List<SpusBean> spus) { this.spus = spus; } public boolean isChecked() { return true; } public void setChecked(boolean isAllChecked) { } public static class SpusBean { /** * _id : 5ac5b0913714cc2d644f461e * id : 1089 * restaurant_id : 32 * category_id : 143 * name : 套餐8:海苔鸡肉卷+辣翅+可乐 * praise_num : 49 * praise_content : 好吃 * month_saled : 1 * month_saled_content : 1 * pic_url : http://p1.meituan.net/wmproduct/735b78e97285214f1e8c62346546e92052099.jpg * __v : 0 * created_at : 2018-04-05T05:08:44.549Z * skus : [{"description":"","price":"20.8","id":1090,"_id":"5ac5b0913714cc2d644f461f"}] * attrs : [] * status_remind_list : [] */ public String _id; public int id; public int restaurant_id; public int category_id; public String name; public int praise_num; public String praise_content; public int month_saled; public String month_saled_content; public String pic_url; public int __v; public String created_at; public List<SkusBean> skus; public List<?> attrs; public List<?> status_remind_list; public String get_id() { return _id; } public void set_id(String _id) { this._id = _id; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getRestaurant_id() { return restaurant_id; } public void setRestaurant_id(int restaurant_id) { this.restaurant_id = restaurant_id; } public int getCategory_id() { return category_id; } public void setCategory_id(int category_id) { this.category_id = category_id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPraise_num() { return praise_num; } public void setPraise_num(int praise_num) { this.praise_num = praise_num; } public String getPraise_content() { return praise_content; } public void setPraise_content(String praise_content) { this.praise_content = praise_content; } public int getMonth_saled() { return month_saled; } public void setMonth_saled(int month_saled) { this.month_saled = month_saled; } public String getMonth_saled_content() { return month_saled_content; } public void setMonth_saled_content(String month_saled_content) { this.month_saled_content = month_saled_content; } public String getPic_url() { return pic_url; } public void setPic_url(String pic_url) { this.pic_url = pic_url; } public int get__v() { return __v; } public void set__v(int __v) { this.__v = __v; } public String getCreated_at() { return created_at; } public void setCreated_at(String created_at) { this.created_at = created_at; } public List<SkusBean> getSkus() { return skus; } public void setSkus(List<SkusBean> skus) { this.skus = skus; } public List<?> getAttrs() { return attrs; } public void setAttrs(List<?> attrs) { this.attrs = attrs; } public List<?> getStatus_remind_list() { return status_remind_list; } public void setStatus_remind_list(List<?> status_remind_list) { this.status_remind_list = status_remind_list; } public void setChecked(boolean isChecked) { } public boolean isChecked() { return true; } public static class SkusBean { /** * description : * price : 20.8 * id : 1090 * _id : 5ac5b0913714cc2d644f461f */ public String description; public String price; public int id; public String _id; public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String get_id() { return _id; } public void set_id(String _id) { this._id = _id; } } } } }
//OkHttp网络请求类
package bwie.com.lenovo.day19.okhttp; import android.os.Environment; import android.os.Handler; import com.google.gson.Gson; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import okhttp3.Cache; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.Interceptor; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class OkHttp { private static volatile OkHttp instence; private Handler handler = new Handler(); private final OkHttpClient okHttpClient; //添加拦截器 private Interceptor getInterceptor(){ Interceptor interceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Response response = chain.proceed(request); return response; } }; return interceptor; } //给OkHttp添加拦截器 private OkHttp(){ File file = new File(Environment.getExternalStorageDirectory(), "abcd"); okHttpClient = new OkHttpClient.Builder() .connectTimeout(3000,TimeUnit.SECONDS) .readTimeout(3000,TimeUnit.SECONDS) .cache(new Cache(file,10*1024)) .addInterceptor(getInterceptor()) .build(); } //单例模式 public static OkHttp getInstence(){ if (instence == null){ synchronized (OkHttp.class){ instence = new OkHttp(); } } return instence; } //创建doPost public void doPost(String url, Map<String,String> param, final Class clazz, final NetCallBack netCallBack){ FormBody.Builder builder = new FormBody.Builder(); for (String key:param.keySet()) { builder.add(key,param.get(key)); } Request request = new Request.Builder() .url(url) .post(builder.build()) .build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { netCallBack.Fairl(); } @Override public void onResponse(Call call, Response response) throws IOException { String string = response.body().string(); Gson gson = new Gson(); final Object o = gson.fromJson(string, clazz); handler.post(new Runnable() { @Override public void run() { netCallBack.Success(o); } }); } }); } //创建doGet请求 public void doGet(String url, final Class clazz, final NetCallBack netCallBack){ Request request = new Request.Builder() .url(url) .get() .build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { netCallBack.Fairl(); } @Override public void onResponse(Call call, Response response) throws IOException { String string = response.body().string(); Gson gson = new Gson(); final Object o = gson.fromJson(string, clazz); handler.post(new Runnable() { @Override public void run() { netCallBack.Success(o); } }); } }); } public interface NetCallBack{ void Success(Object object); void Fairl(); } }
//Model接口
package bwie.com.lenovo.day19.model; public interface IGouModel { public void showGouModel(String url,GouCallBack gouCallBack); public interface GouCallBack{ void Success(Object o); void Frilt(); } }
//Model类
package bwie.com.lenovo.day19.model; import bwie.com.lenovo.day19.bean.GouBean; import bwie.com.lenovo.day19.okhttp.OkHttp; public class GouModel implements IGouModel { @Override public void showGouModel(String url, final GouCallBack gouCallBack) { OkHttp.getInstence().doGet(url, GouBean.class, new OkHttp.NetCallBack() { @Override public void Success(Object object) { gouCallBack.Success(object); } @Override public void Fairl() { } }); } }
//presenter接口
package bwie.com.lenovo.day19.presenter; public interface IGouPresenter { public void showGouPre(); }
//presenter类
package bwie.com.lenovo.day19.presenter; import bwie.com.lenovo.day19.api.Api; import bwie.com.lenovo.day19.fragment.GouWuFragment; import bwie.com.lenovo.day19.model.GouModel; import bwie.com.lenovo.day19.model.IGouModel; public class GouPresenter implements IGouPresenter { GouWuFragment gouWuFragment; private final GouModel gouModel; public GouPresenter(GouWuFragment gouWuFragment) { this.gouWuFragment = gouWuFragment; gouModel = new GouModel(); } @Override public void showGouPre() { gouModel.showGouModel(Api.GOU_URL, new IGouModel.GouCallBack() { @Override public void Success(Object o) { gouWuFragment.getData(o); } @Override public void Frilt() { } }); } }
//商家adapter
package bwie.com.lenovo.day19.adapter; import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.OrientationHelper; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.TextView; import java.util.List; import bwie.com.lenovo.day19.R; import bwie.com.lenovo.day19.bean.GouBean; public class GouAdapter extends RecyclerView.Adapter<GouAdapter.GouHolder> { Context context; GouBean gouBean; List<GouBean.DataBean> list; public GouAdapter(Context context, List<GouBean.DataBean> list) { this.context = context; this.list = list; } @NonNull @Override public GouAdapter.GouHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { View view = LayoutInflater.from(context).inflate(R.layout.item, viewGroup, false); GouHolder gouHolder = new GouHolder(view); return gouHolder; } @Override public void onBindViewHolder(@NonNull final GouAdapter.GouHolder gouHolder, final int i) { String names = list.get(i).getName(); gouHolder.name.setText(names); //布局管理器 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context); linearLayoutManager.setOrientation(OrientationHelper.VERTICAL); gouHolder.rc.setLayoutManager(linearLayoutManager); final WuAdapter wuAdapter = new WuAdapter(context, list,i); gouHolder.rc.setAdapter(wuAdapter); //点击事件 //判断商家是不是被选中,如果选中 gouHolder.shangjia.setChecked(list.get(i).isChecked()); //子布局适配器点击事件 wuAdapter.setShopCallBackListener(new WuAdapter.ShopCallBackListener() { @Override public void callBack() { if (mshopCallBackListener!=null){ mshopCallBackListener.callBack(gouBean.getData()); } List<GouBean.DataBean> spus = gouBean.getData(); boolean isAllChecked = true; for (GouBean.DataBean bean:spus) { if (!bean.isChecked()){ //只要有一个商品未选中,标志位置成false,并且跳出循环 isAllChecked = false; break; } } //刷新商家的状态 gouHolder.shangjia.setChecked(isAllChecked); gouBean.getData().get(i).setChecked(isAllChecked); } }); gouHolder.shangjia.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { list.get(i).setChecked(gouHolder.shangjia.isChecked()); wuAdapter.selectOrremoveAll(gouHolder.shangjia.isChecked()); } }); } @Override public int getItemCount() { return list.size(); } public class GouHolder extends RecyclerView.ViewHolder { CheckBox shangjia; TextView name; RecyclerView rc; public GouHolder(@NonNull View itemView) { super(itemView); shangjia = itemView.findViewById(R.id.shangjia); name = itemView.findViewById(R.id.titles); rc = itemView.findViewById(R.id.adapter_rec); } } //接口回调 private ShopCallBackListener mshopCallBackListener; public void setShopCallBackListener(ShopCallBackListener listener) { this.mshopCallBackListener = listener; } public interface ShopCallBackListener{ void callBack(List<GouBean.DataBean> list); } }
//商品adapter
package bwie.com.lenovo.day19.adapter; import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import java.util.List; import bwie.com.lenovo.day19.R; import bwie.com.lenovo.day19.bean.GouBean; public class WuAdapter extends RecyclerView.Adapter<WuAdapter.WuHolder> { Context context; List<GouBean.DataBean> list; int a; public WuAdapter(Context context, List<GouBean.DataBean> list, int i) { this.context = context; this.list = list; this.a = i; } @NonNull @Override public WuAdapter.WuHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { View view = LayoutInflater.from(context).inflate(R.layout.item2, viewGroup, false); WuHolder wuHolder = new WuHolder(view); return wuHolder; } @Override public void onBindViewHolder(@NonNull WuAdapter.WuHolder wuHolder, final int i) { wuHolder.name.setText(list.get(a).getName()); // wuHolder.price.setText(list.get(i).getSkus().get(i).getPrice()); wuHolder.price.setText(list.get(a).getSpus().get(i).getPraise_num()+""); Glide.with(context).load(list.get(a).getSpus().get(i).getPic_url()).into(wuHolder.img); //判断商品是否选中 // wuHolder.shangpin.setChecked(list.get(i).isChecked()); wuHolder.shangpin.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { //如果备选中 list.get(i).setChecked(isChecked); if (shopCallBackListener!=null){ shopCallBackListener.callBack(); } } }); } @Override public int getItemCount() { return list.get(a).getSpus().size(); } public class WuHolder extends RecyclerView.ViewHolder { private final ImageView img; private final TextView name; private final TextView price; private final CheckBox shangpin; public WuHolder(@NonNull View itemView) { super(itemView); img = itemView.findViewById(R.id.img); name = itemView.findViewById(R.id.name); price = itemView.findViewById(R.id.price); shangpin = itemView.findViewById(R.id.shangpin); } } //定义子产品的全选反选的方法 public void selectOrremoveAll(boolean isChecked){ for (GouBean.DataBean listBean:list) { listBean.setChecked(isChecked); } notifyDataSetChanged(); } //定义接口回调 private ShopCallBackListener shopCallBackListener; public void setShopCallBackListener(ShopCallBackListener shopCallBackListener) { this.shopCallBackListener = shopCallBackListener; } public interface ShopCallBackListener{ void callBack(); } }
//activity主页面
package bwie.com.lenovo.day19; import android.graphics.Color; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import com.hjm.bottomtabbar.BottomTabBar; import bwie.com.lenovo.day19.fragment.GouWuFragment; import bwie.com.lenovo.day19.fragment.MyFragment; public class MainActivity extends AppCompatActivity { private BottomTabBar bot; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bot = findViewById(R.id.bottomtb); bot.init(getSupportFragmentManager()) .setFontSize(16) .setImgSize(50,50) .setTabPadding(4,6,8) .setChangeColor(Color.RED,Color.BLUE) .addTabItem("购物车",R.drawable.ic_action_name_car,GouWuFragment.class) .addTabItem("我的",R.drawable.common_tab_btn_my_n_hdpi,MyFragment.class); } }
//购物车fragment页面
package bwie.com.lenovo.day19.fragment; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.OrientationHelper; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import java.util.List; import bwie.com.lenovo.day19.R; import bwie.com.lenovo.day19.adapter.GouAdapter; import bwie.com.lenovo.day19.bean.GouBean; import bwie.com.lenovo.day19.presenter.GouPresenter; public class GouWuFragment extends Fragment { private RecyclerView rec; private GouPresenter gouPresenter; List<GouBean.DataBean> list; private CheckBox quan; private GouBean gouBean; private GouAdapter gouAdapter; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.gouwufragment, container, false); rec = view.findViewById(R.id.rec); quan = view.findViewById(R.id.quan); //布局管理器 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); linearLayoutManager.setOrientation(OrientationHelper.VERTICAL); rec.setLayoutManager(linearLayoutManager); //presenter gouPresenter = new GouPresenter(this); gouPresenter.showGouPre(); //全选点击事件 quan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { checkSeller(quan.isChecked()); //刷新适配器 gouAdapter.notifyDataSetChanged(); } }); return view; } public void getData(Object o){ GouBean gouBean = (GouBean) o; list = gouBean.getData(); gouAdapter = new GouAdapter(getActivity(), list); rec.setAdapter(gouAdapter); } //全选反选 private void checkSeller(boolean bool){ //循环遍历商家,看商家是否选中 for (int a=0;a<list.size();a++){ //遍历商家,改变状态 GouBean.DataBean dataBean = list.get(a); dataBean.setChecked(bool); //循环遍历产品,看产品是否选中 /*List<GouBean.DataBean> data = gouBean.getData(); for (int i = 0;i<data.size();i++){ //遍历商品,改变状态,如果选中了 data.get(i).setChecked(bool); }*/ } } }
//需要的依赖有
//okhttp3的依赖 implementation 'com.squareup.okhttp3:okhttp:3.7.0' implementation 'com.squareup.okio:okio:1.12.0' //BottomTabBar依赖 implementation 'com.hjm:BottomTabBar:1.1.1' //recyclerListView依赖 implementation 'com.android.support:recyclerview-v7:28.0.0' //gson的依赖 implementation 'com.google.code.gson:gson:2.8.5' //glide的依赖 implementation 'com.github.bumptech.glide:glide:4.8.0' //imageloader的依赖 implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' implementation 'com.youth.banner:banner:1.4.9' implementation "com.jakewharton:butterknife:8.4.0" annotationProcessor "com.jakewharton:butterknife-compiler:8.4.0"
//清单文件需要的权限
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>