retrofit+rxjava+okhttp+拦截器,二级列表购物车,网络删除数据

依赖

    compile 'com.jakewharton:butterknife:8.5.1'
    compile 'com.squareup.okhttp3:okhttp:3.9.0'
    compile 'org.greenrobot:eventbus:3.0.0'
    compile 'com.squareup.retrofit2:retrofit:2.4.0'
    compile 'com.squareup.retrofit2:converter-gson:2.4.0'
    compile 'io.reactivex.rxjava2:rxjava:2.0.1'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
    compile 'org.greenrobot:greendao:3.2.0'
    compile 'com.fynn.fluidlayout:fluidlayout:1.0'
    compile 'com.github.bumptech.glide:glide:3.7.0'
    compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
    compile 'com.android.support:design:26.0.0-alpha1'
    compile 'com.jcodecraeer:xrecyclerview:1.5.2'
    testCompile 'junit:junit:4.12'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'

权限

 <uses-permission android:name="android.permission.INTERNET" />

utils


RetrofitUtils

public class RetrofitUtils {
    private static RetrofitUtils retrofitUtils=null;
    private final Retrofit retrofit;

    public RetrofitUtils() {

     OkHttpClient.Builder okHttpClient = new OkHttpClient.Builder().addInterceptor(new CommonInterceptor());
        okHttpClient.readTimeout(3000, TimeUnit.SECONDS);
        okHttpClient.connectTimeout(3000,TimeUnit.SECONDS);

        retrofit = new Retrofit.Builder()
                .baseUrl(HttpApi.BaseUrl)
                .client(okHttpClient.build())
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

    }
    public static RetrofitUtils getInstance(){
        if(null==retrofitUtils){
            synchronized (RetrofitUtils.class){
                if(null==retrofitUtils){
                    retrofitUtils=new RetrofitUtils();
                }
            }
        }
        return retrofitUtils;
    }

    public Api getApi(){
        return retrofit.create(Api.class);
    }

}

httpConfig

Api
 //查询购物车
    @GET(HttpApi.CheckCarUrl)
    Observable<ShopCarBean> getCars(@Query("uid") String uid);

    //删除购物车
    @GET(HttpApi.DelCarUrl)
    Observable<DelCarBean> getDels(@Query("uid") String uid, @Query("pid") String pid);


    //当前子分类下的商品列表
    @GET(HttpApi.GoodsUrl)
    Observable<GoodsBean> getGoods(@Query("pscid") String pscid, @Query("page") String page);

    //商品详情
    @GET(HttpApi.InfoUrl)
    Observable<InfoBean> getInfo(@Query("pid") String pid);

    //添加购物车
    @GET(HttpApi.AddCarUrl)
    Observable<AddCarBean> addCar(@Query("uid") String uid, @Query("pid") String pid);

    //根据关键词搜索商品
    @GET(HttpApi.SearchUrl)
    Observable<SearchBean> search(@Query("keywords") String keywords);
HttpApi
public class HttpApi {
        //公共接口
    public static final String BaseUrl="https://www.zhaoapi.cn/";



    //查询购物车
    public static final String CheckCarUrl="product/getCarts";

    //删除购物车(新增)
    public static final String DelCarUrl="product/deleteCart";


    //当前子分类下的商品列表
    public static final String GoodsUrl="product/getProducts";

    //商品详情
    public static final String InfoUrl="product/getProductDetail";

    //添加购物车
    public static final String AddCarUrl="product/addCart";

    //根据关键词搜索商品
    public static final String SearchUrl="product/searchProducts";
}

IGWCModel

public interface IGWCModel {
    //查询购物车
    void getCar(String uid, IGWCPresenter igwcPresenter);
    //删除购物车
    void delCar(String uid, String pid, IGWCPresenter igwcPresenter);
}
GWCModel
public class GWCModel implements IGWCModel {
    //查询购物车
    @Override
    public void getCar(String uid, final IGWCPresenter igwcPresenter) {
        Observable<ShopCarBean> cars = RetrofitUtils.getInstance().getApi().getCars(uid);
        cars.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<ShopCarBean>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(ShopCarBean value) {
                        List<ShopCarBean.DataBean> data = value.getData();
                        igwcPresenter.onSuccess(data);
                    }

                    @Override
                    public void onError(Throwable e) {
                        igwcPresenter.onFailed(e.getMessage());

                    }
                    @Override
                    public void onComplete() {

                    }
                });

    }
        //删除购物车
    @Override
    public void delCar(String uid, String pid, final IGWCPresenter igwcPresenter) {
        Observable<DelCarBean> dels = RetrofitUtils.getInstance().getApi().getDels(uid, pid);
        dels.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<DelCarBean>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(DelCarBean value) {
                        String msg = value.getMsg();
                        igwcPresenter.delSuccess(msg);


                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }
}

IGWCPresenter

public interface IGWCPresenter {
    void getCarUid(String uid);
    void onSuccess(List<ShopCarBean.DataBean> data);
    void onFailed(String error);
    void onDestory();

    void getDelCar(String uid, String pid);
    void delSuccess(String msg);
}

GWCPresenter

public class GWCPresenter implements IGWCPresenter {
    private static final String TAG ="GWCPresenter----" ;
    private IGWCView igwcView;
    private final GWCModel gwcModel;

    public GWCPresenter(IGWCView igwcView) {
        this.igwcView = igwcView;
        gwcModel = new GWCModel();
    }
//查询购物车
    @Override
    public void getCarUid(String uid) {
        gwcModel.getCar(uid,this);
    }

    @Override
    public void onSuccess(List<ShopCarBean.DataBean> data) {
        igwcView.showCarData(data);

    }

    @Override
    public void onFailed(String error) {

        Log.d(TAG, "onFailed: "+error);

    }

    @Override
    public void onDestory() {
        if(null!=igwcView){
            igwcView=null;
        }

    }
//删除购物车
    @Override
    public void getDelCar(String uid, String pid) {
        gwcModel.delCar(uid,pid,this);
    }

    @Override
    public void delSuccess(String msg) {
        igwcView.delCarData(msg);

    }
}

MainActivity

public class MainActivity extends AppCompatActivity implements IGWCView, MyExpandAdapter.CheckGroupItemListener, MyExpandAdapter.ModifyGoodsItemListener {

    private static final String TAG ="MainActivity---" ;

    private MyExpandAdapter adapter;

    private TextView tvAllPrice;
    private TextView btnAmount;
    private TextView btnEditor;
    private CheckBox btnCheckAll;
    private ExpandableListView expandList;


   private List<ShopCarBean.DataBean> list=new ArrayList<>();
    //默认是false
    private boolean flag;


    //购买商品的总数量
    private int totalNum = 0;
    //购买商品的总价
    private double totalPrice= 0.00;
    private GWCPresenter gwcPresenter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //隐藏actionbar
        getSupportActionBar().hide();

        setContentView(R.layout.activity_main);
        initView();

        gwcPresenter = new GWCPresenter(this);
        gwcPresenter.getCarUid("13576");



        //设置适配器
        adapter = new MyExpandAdapter(list,this);
        expandList.setAdapter(adapter);
        adapter.setCheckGroupItemListener(this);

        adapter.setModifyGoodsItemListener(this);

        btnCheckAll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                isChoosedAll(((CheckBox)view).isChecked());

                //计算总价
               checkPrice();
            }
        });

        btnEditor.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(!flag){//编辑 -> 完成
                    flag=true;
                    btnEditor.setText("完成");
                    adapter.showDeleteButton(flag);
                }else{
                    flag=false;
                    btnEditor.setText("编辑");
                    adapter.showDeleteButton(flag);
                }
            }
        });


    }

    private void initView() {
        //二级列表
        expandList = (ExpandableListView) findViewById(R.id.expandList);
        //购物车底部栏的全选框
        btnCheckAll = (CheckBox) findViewById(R.id.btnCheckAll);
        //合计,计算总价
        tvAllPrice = (TextView) findViewById(R.id.tvAllPrice);
        //结算按钮
        btnAmount = (TextView) findViewById(R.id.btnAmount);
        //找到编辑控件
        btnEditor = (TextView) findViewById(R.id.btnEditor);



    }

    @Override
    public void showCarData(List<ShopCarBean.DataBean> data) {

        list.addAll(data);
        Log.d(TAG, "showCarData: "+data);


        for(int i=0;i<data.size();i++){
            expandList.expandGroup(i);

        }

    }

    @Override
    public void delCarData(String msg) {
        Toast.makeText(MainActivity.this,msg.toString(),Toast.LENGTH_SHORT).show();

    }

    @Override
    public void checkGroupItem(int groupPosition, boolean isChecked) {
        ShopCarBean.DataBean dataBean = list.get(groupPosition);
        //商家的复选框的选中状态
        dataBean.setGroupChoosed(isChecked);
        //遍历商家里面的商品,将商品置为同样的状态
        for(ShopCarBean.DataBean.ListBean listBean:dataBean.getList()){
            listBean.setChildChoosed(isChecked);
        }

        //将底部全选btnCheckAll置为与上面同样的状态
        if(isCheckAll()){
            btnCheckAll.setChecked(true);
        }else{
            btnCheckAll.setChecked(false);
        }


        //刷新适配器
        adapter.notifyDataSetChanged();
        checkPrice();
    }

    @Override
    public void checkChildItem(int groupPosition, int childPosition, boolean isChecked) {
        ShopCarBean.DataBean dataBean = list.get(groupPosition);
        ShopCarBean.DataBean.ListBean listBean = list.get(groupPosition).getList().get(childPosition);
            listBean.setChildChoosed(isChecked);

        boolean goodsCheckAll = isGoodsCheckAll(groupPosition);
        if(goodsCheckAll){
            dataBean.setGroupChoosed(goodsCheckAll);
        }else{
            dataBean.setGroupChoosed(goodsCheckAll);
        }


        if(isCheckAll()){
            btnCheckAll.setChecked(true);
        }else {
            btnCheckAll.setChecked(false);
        }


        //刷新适配器
        adapter.notifyDataSetChanged();

        checkPrice();

    }
//判断某个商家的商品是否全部选中,如果都选中的话,商家CheckBox应该是选中状态
    private boolean isGoodsCheckAll(int groupPosition){
        List<ShopCarBean.DataBean.ListBean> lists = this.list.get(groupPosition).getList();
       for(ShopCarBean.DataBean.ListBean list:lists ){
           if(list.isChildChoosed()){
               continue;
           }else {
               return false;
           }
       }

        return  true;
    }
    //判断购物车商品是否全部选中
    private boolean isCheckAll(){
        for(ShopCarBean.DataBean dataBean:list){
            if(!dataBean.isGroupChoosed()){
                return false;
            }
        }
        return true;
    }

    //全选反选
    private void isChoosedAll(boolean isChecked){

        for(ShopCarBean.DataBean dataBean:list){
            dataBean.setGroupChoosed(isChecked);
            for(ShopCarBean.DataBean.ListBean listBean:dataBean.getList()){
                listBean.setChildChoosed(isChecked);
            }
        }
        adapter.notifyDataSetChanged();

    }


    @Override
    public void doIncrease(int groupPosition, int childPosition, View view) {

        ShopCarBean.DataBean.ListBean listBean = list.get(groupPosition).getList().get(childPosition);
        int num = listBean.getNum();
        num++;
        listBean.setNum(num);

        //刷新适配器
        adapter.notifyDataSetChanged();

        checkPrice();
    }

    @Override
    public void doDecrease(int groupPosition, int childPosition, View view) {
        ShopCarBean.DataBean.ListBean listBean = list.get(groupPosition).getList().get(childPosition);
        int num = listBean.getNum();
        if(num==1){
            return;
        }
        num--;
        listBean.setNum(num);


        //刷新适配器
        adapter.notifyDataSetChanged();
        checkPrice();
    }

    @Override
    public void deleteItem(int groupPosition, int childPosition, int pid) {
        gwcPresenter.getDelCar("13576",pid+"");

        list.get(groupPosition).getList().remove(childPosition);
        if (list.get(groupPosition).getList().size() == 0) {
        list.remove(groupPosition);
        }
        adapter.notifyDataSetChanged();
        checkPrice();
    }



    //计算总价
    private void checkPrice(){
        totalNum=0;
        totalPrice=0;

        for(ShopCarBean.DataBean dataBean:list){
            for(ShopCarBean.DataBean.ListBean listBean:dataBean.getList()){
                if(listBean.isChildChoosed()){
                    totalNum++;
                    totalPrice+=listBean.getNum()*listBean.getPrice();
                }
            }
        }
        //设置文本信息 合计、结算的商品数量
        tvAllPrice.setText("合计:¥"+totalPrice);
        btnAmount.setText("结算("+totalNum+")");
    }
}

MyExpandAdapter

public class MyExpandAdapter extends BaseExpandableListAdapter{

    private List<ShopCarBean.DataBean> list;
    private Context context;

    private CheckGroupItemListener checkGroupItemListener;
    private ModifyGoodsItemListener modifyGoodsItemListener;

    //接收是否处于编辑状态的一个boolean值
    private boolean isEditor;
    public void showDeleteButton(boolean isEditor){
        this.isEditor=isEditor;
        //刷新适配器
        notifyDataSetChanged();
    }




    public void setCheckGroupItemListener(CheckGroupItemListener checkGroupItemListener) {
        this.checkGroupItemListener = checkGroupItemListener;
    }

    public void setModifyGoodsItemListener(ModifyGoodsItemListener modifyGoodsItemListener) {
        this.modifyGoodsItemListener = modifyGoodsItemListener;
    }

    public MyExpandAdapter(List<ShopCarBean.DataBean> list, Context context) {
        this.list = list;
        this.context = context;
    }

    @Override
    public int getGroupCount() {
        return list!=null?list.size():0;
    }

    @Override
    public int getChildrenCount(int i) {
        return list!=null&&list.get(i).getList()!=null?list.get(i).getList().size():0;
    }

    @Override
    public Object getGroup(int groupPosition) {
        return list.get(groupPosition);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return list.get(groupPosition).getList().get(childPosition);
    }

    @Override
    public long getGroupId(int i) {
        return i;
    }

    @Override
    public long getChildId(int i, int i1) {
        return i1;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public View getGroupView(final int i, boolean b, View view, ViewGroup viewGroup) {
        GroupViewHolder groupViewHolder;
        if(view==null){
            view= view.inflate(context, R.layout.layout_group, null);

            groupViewHolder = new GroupViewHolder();
            groupViewHolder.groudCheckbox=view.findViewById(R.id.group_choosed);
            view.setTag(groupViewHolder);
        }else{
            groupViewHolder = (GroupViewHolder) view.getTag();
        }
        groupViewHolder.groudCheckbox.setText(list.get(i).getSellerName());

        if(list.get(i).isGroupChoosed()){
            groupViewHolder.groudCheckbox.setChecked(true);
        }else {
            groupViewHolder.groudCheckbox.setChecked(false);
        }
        groupViewHolder.groudCheckbox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                checkGroupItemListener.checkGroupItem(i,((CheckBox)view).isChecked());
            }
        });
        return view;
    }

    @Override
    public View getChildView(final int i, final int i1, boolean b, View view, ViewGroup viewGroup) {
        final ChildViewHolder childViewHolder ;
        if(view==null){
            view= view.inflate(context, R.layout.layout_child, null);
            childViewHolder = new ChildViewHolder();
            childViewHolder.childCheckbox= view.findViewById(R.id.child_choosed);
            childViewHolder.img=view.findViewById(R.id.img);
            childViewHolder.titleName=view.findViewById(R.id.titleName);
            childViewHolder.littleTitle=view.findViewById(R.id.littleTitle);
            childViewHolder.price=view.findViewById(R.id.price);
            childViewHolder.count=view.findViewById(R.id.count);
            childViewHolder.btnSub=view.findViewById(R.id.btnSub);
            childViewHolder.btnAdd=view.findViewById(R.id.btnAdd);
            childViewHolder.showNum=view.findViewById(R.id.showNum);
            childViewHolder.delete=view.findViewById(R.id.delete);


            view.setTag(childViewHolder);


        }else {
            childViewHolder = (ChildViewHolder) view.getTag();
        }

        childViewHolder.titleName.setText(list.get(i).getList().get(i1).getTitle());
        childViewHolder.littleTitle.setText(list.get(i).getList().get(i1).getSubhead());
        childViewHolder.price.setText("¥"+list.get(i).getList().get(i1).getPrice());
        childViewHolder.count.setText("x"+list.get(i).getList().get(i1).getNum());
        childViewHolder.showNum.setText(list.get(i).getList().get(i1).getNum()+"");
        String images = list.get(i).getList().get(i1).getImages();
        String[] split = images.split("\\|");
        Glide.with(context).load(split[0]).into(childViewHolder.img);


        if(list.get(i).getList().get(i1).isChildChoosed()){
            childViewHolder.childCheckbox.setChecked(true);
        }else {
            childViewHolder.childCheckbox.setChecked(false);
        }

        childViewHolder.childCheckbox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                checkGroupItemListener.checkChildItem(i,i1,((CheckBox)view).isChecked());
            }
        });

        childViewHolder.btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                modifyGoodsItemListener.doIncrease(i,i1,childViewHolder.showNum);
            }
        });
        childViewHolder.btnSub.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                modifyGoodsItemListener.doDecrease(i,i1,childViewHolder.showNum);
            }
        });

        childViewHolder.delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                modifyGoodsItemListener.deleteItem(i,i1,list.get(i).getList().get(i1).getPid());
                notifyDataSetChanged();

            }

        });
        //控制删除按钮的隐藏与显示
        if(isEditor){
            childViewHolder.delete.setVisibility(View.VISIBLE);
        }else{
            childViewHolder.delete.setVisibility(View.GONE);
        }

        return view;
    }

    @Override
    public boolean isChildSelectable(int i, int i1) {
        return false;
    }

    class GroupViewHolder{
        CheckBox groudCheckbox;
    }
    class ChildViewHolder{
        CheckBox childCheckbox;
        ImageView img;
        TextView titleName;
        TextView littleTitle ;
        TextView price  ;
        TextView count  ;
        TextView btnSub  ;
        TextView showNum   ;
        TextView btnAdd   ;
        Button delete;
    }

    public interface CheckGroupItemListener{
        void checkGroupItem(int groupPosition,boolean isChecked);

        void checkChildItem(int groupPosition,int childPosition, boolean isChecked);

    }

    public interface ModifyGoodsItemListener{
        void doIncrease(int groupPosition,int childPosition,View view);
        void doDecrease(int groupPosition,int childPosition,View view);
        void deleteItem(int groupPosition,int childPosition,int pid);
    }
}

CommonInterceptor

public class CommonInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        HttpUrl httpUrl = request
                .url()
                .newBuilder()
                .addQueryParameter("source", "android")
                .build();
        Request requestNew = request
                .newBuilder()
                .url(httpUrl)
                .build();
        return chain.proceed(requestNew);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值