电商项目购物车页面新框架

1.ShopCarContract

package com.example.jingdong.ui.shopcar.contract;

import com.example.jingdong.bean.BaseBean;
import com.example.jingdong.bean.SellerBean;
import com.example.jingdong.bean.ShopCarBean;
import com.example.jingdong.ui.base.BaseContract;

import java.util.List;

public interface ShopCarContract {
    interface View extends BaseContract.BaseView{
        void showShopCar(List<SellerBean> groupList, List<List<ShopCarBean.DataBean.ListBean>> childList);
        void updateSuccess(BaseBean baseBean);
        void delSuccess(BaseBean baseBean);
    }

    interface Presenter extends BaseContract.BasePresenter<View>{
        void getShopCar(String uid, String token);
        void updateShopCar(String uid, String sellerid, String pid, String num, String selected, String token);
        void delShopCar(String uid, String pid, String token);
    }

}

2.ShopCarPresenter

package com.example.jingdong.ui.shopcar.presenter;

import com.example.jingdong.bean.BaseBean;
import com.example.jingdong.bean.SellerBean;
import com.example.jingdong.bean.ShopCarBean;
import com.example.jingdong.net.NetApi;
import com.example.jingdong.net.NetApiService;
import com.example.jingdong.ui.base.BasePresenter;
import com.example.jingdong.ui.shopcar.contract.ShopCarContract;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

import io.reactivex.Observer;
import io.reactivex.Scheduler;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;

public class ShopCarPresenter extends BasePresenter<ShopCarContract.View> implements ShopCarContract.Presenter{

    private NetApi netApi;
    @Inject
    public ShopCarPresenter(NetApi netApi) {
        this.netApi = netApi;
    }

    @Override
    public void getShopCar(String uid, String token) {
        netApi.getCar(uid, token)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Observer<ShopCarBean>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(ShopCarBean shopCarBean) {
                        if (mView!=null){
                            //用于封装一级列表
                            List<SellerBean> groupList = new ArrayList<>();
                            //用于封装二级列表
                            List<List<ShopCarBean.DataBean.ListBean>> childList = new ArrayList<>();
                            //获取数据
                            List<ShopCarBean.DataBean> data = shopCarBean.getData();
                            //循环获取数据
                            for (int i = 0; i < data.size(); i++) {
                                ShopCarBean.DataBean dataBean = data.get(i);
                                //添加父集合
                                SellerBean sellerBean = new SellerBean();
                                sellerBean.setSellerName(dataBean.getSellerName());
                                sellerBean.setSellerid(dataBean.getSellerid());
                                //设置是否全部选中
                                sellerBean.setSelected(isSellerProductAllSeleect(dataBean));
                                groupList.add(sellerBean);
                                //添加子集合
                                childList.add(data.get(i).getList());
                            }
                            //展示数据
                            mView.showShopCar(groupList,childList);
                        }
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }

    @Override
    public void updateShopCar(String uid, String sellerid, String pid, String num, String selected, String token) {
        netApi.updateCar(uid, sellerid, pid, num, selected, token)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<BaseBean>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(BaseBean baseBean) {
                        mView.updateSuccess(baseBean);
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }

    @Override
    public void delShopCar(String uid, String pid, String token) {
        netApi.delCar(uid, pid, token)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Observer<BaseBean>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(BaseBean baseBean) {
                        mView.delSuccess(baseBean);
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }

    //判断该商家下面的商品是否全选
    private boolean isSellerProductAllSeleect(ShopCarBean.DataBean dataBean){
        //获取该商家下的所有商品
        List<ShopCarBean.DataBean.ListBean> list = dataBean.getList();
        for (int i = 0; i < list.size(); i++) {
            ShopCarBean.DataBean.ListBean listBean = list.get(i);
            if (0==listBean.getSelected()){
                return false;
            }
        }
        return true;
    }
}

3.ShopCarFragment

package com.example.jingdong.ui.shopcar;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.TextView;

import com.example.jingdong.R;
import com.example.jingdong.bean.BaseBean;
import com.example.jingdong.bean.SellerBean;
import com.example.jingdong.bean.ShopCarBean;
import com.example.jingdong.component.DaggerHttpComponent;
import com.example.jingdong.ui.base.BaseFragment;
import com.example.jingdong.ui.shopcar.adapter.ElvShopCarAdapter;
import com.example.jingdong.ui.shopcar.contract.ShopCarContract;
import com.example.jingdong.ui.shopcar.presenter.ShopCarPresenter;
import com.example.jingdong.util.DialogUtil;
import com.example.jingdong.util.SpUtil;

import java.util.List;

public class ShopCarFragment extends BaseFragment<ShopCarPresenter> implements ShopCarContract.View {

    private ExpandableListView elv_shopcar;
    /**
     * 全选
     */
    private CheckBox ck_all;
    /**
     * 合计:
     */
    private TextView tv_Money;
    /**
     * 去结算:
     */
    private TextView tv_Total;
    private ProgressDialog progressDialog;
    private ElvShopCarAdapter elvShopCarAdapter;

    @Override
    public int getContentLayout() {
        return R.layout.fragment_shopcar;
    }

    @Override
    public void inject() {
        DaggerHttpComponent.builder()
                .build()
                .inject(this);
    }

    @Override
    public void initView(View view) {
        elv_shopcar = (ExpandableListView) view.findViewById(R.id.elv_shopcar);
        ck_all = (CheckBox) view.findViewById(R.id.ck_all);
        tv_Money = (TextView) view.findViewById(R.id.tv_Money);
        tv_Total = (TextView) view.findViewById(R.id.tv_Total);
        //初始化进度显示
        progressDialog = DialogUtil.getProgressDialog(getActivity());
        //获取uid和token值
        String uid = SpUtil.getString(getActivity(), "uid", "");
        String token = SpUtil.getString(getActivity(), "token", "");
        //获取数据
        if (!("").equals(uid) && !("").equals(token)){
            mPresenter.getShopCar(uid,token);
        }

        //点击全选按钮的监听
        ck_all.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (elvShopCarAdapter!=null){
                    progressDialog.show();
                    elvShopCarAdapter.changeAllState(ck_all.isChecked());
                }
            }
        });
    }

    @Override
    public void showShopCar(List<SellerBean> groupList, List<List<ShopCarBean.DataBean.ListBean>> childList) {
        //判断所有商家是否全部选中
        ck_all.setChecked(isSellerAllSelected(groupList));
        //设置适配器
        elvShopCarAdapter = new ElvShopCarAdapter(groupList, childList, getActivity(), mPresenter, progressDialog);
        elv_shopcar.setAdapter(elvShopCarAdapter);

        //获取商品总价和数量
        String[] strings = elvShopCarAdapter.computeMoneyAndNum();
        tv_Money.setText("总计:" + strings[0] + "元");
        tv_Total.setText("去结算" + strings[1] + "个");

        //默认全部展开
        for (int i = 0; i < groupList.size(); i++) {
            elv_shopcar.expandGroup(i);
        }

        //关闭进度条
        progressDialog.dismiss();
    }

    @Override
    public void updateSuccess(BaseBean baseBean) {
        elvShopCarAdapter.updateSuccess();
    }

    @Override
    public void delSuccess(BaseBean baseBean) {
        elvShopCarAdapter.delSuccess();
    }


    private boolean isSellerAllSelected(List<SellerBean> groupList){
        for (int i = 0; i < groupList.size(); i++) {
            SellerBean sellerBean = groupList.get(i);
            if (!sellerBean.isSelected()){
                return false;
            }
        }
        return true;
    }

}

4.NetApiService

package com.example.jingdong.net;

import com.example.jingdong.bean.BaseBean;
import com.example.jingdong.bean.GoodsListBean;
import com.example.jingdong.bean.ShopCarBean;
import com.example.jingdong.bean.UserBean;

import io.reactivex.Observable;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;

public interface NetApiService {

    //获取商品列表
    @FormUrlEncoded
    @POST("product/getProducts")
    Observable<GoodsListBean> getGoodsList(@Field("pscid") String pscid);

    //登录
    @FormUrlEncoded
    @POST("user/login")
    Observable<UserBean> login(@Field("mobile") String mobile, @Field("password") String password);

    //添加购物车
    @FormUrlEncoded
    @POST("product/addCart")
    Observable<BaseBean> addCar(@Field("Uid") String uid, @Field("Pid") String pid, @Field("Token") String token);

    //查询购物车
    @FormUrlEncoded
    @POST("product/getCarts")
    Observable<ShopCarBean> getCar(@Field("uid") String uid, @Field("token") String token);

    //更新购物车
    @FormUrlEncoded
    @POST("product/updateCarts")
    Observable<BaseBean> updateCar(@Field("uid") String uid,
                                   @Field("sellerid") String sellerid,
                                   @Field("pid") String pid,
                                   @Field("num") String num,
                                   @Field("selected") String selected,
                                   @Field("token") String token);

    //删除购物车
    @FormUrlEncoded
    @POST("product/deleteCart")
    Observable<BaseBean> delCar(@Field("uid") String uid, @Field("pid") String pid, @Field("token") String token);
}

5.NetApi

package com.example.jingdong.net;

import com.example.jingdong.bean.BaseBean;
import com.example.jingdong.bean.GoodsListBean;
import com.example.jingdong.bean.ShopCarBean;
import com.example.jingdong.bean.UserBean;

import io.reactivex.Observable;
import retrofit2.http.Field;

public class NetApi {
    private static NetApi netApi;
    private NetApiService netApiService;

    private NetApi(NetApiService netApiService) {
        this.netApiService = netApiService;
    }

    public static NetApi getNetApi(NetApiService netApiService) {
        if (netApi == null) {
            netApi = new NetApi(netApiService);
        }
        return netApi;
    }

    //获取商品列表
    public Observable<GoodsListBean> getGoodsList(String pscid) {
        return netApiService.getGoodsList(pscid);
    }

    //实现登录
    public Observable<UserBean> login(String mobile, String password) {
        return netApiService.login(mobile, password);
    }

    //添加购物车
    public Observable<BaseBean> addCar(String uid, String pid, String token) {
        return netApiService.addCar(uid, pid, token);
    }

    //查询购物车
    public Observable<ShopCarBean> getCar(String uid, String token) {
        return netApiService.getCar(uid, token);
    }

    //更新购物车
    public Observable<BaseBean> updateCar(String uid, String sellerid, String pid, String num, String selected, String token) {
        return netApiService.updateCar(uid, sellerid, pid, num, selected, token);
    }

    //删除购物车
    public Observable<BaseBean> delCar(String uid, String pid, String token) {
        return netApiService.delCar(uid, pid, token);
    }

}

6.适配器ElvShopCarAdapter

package com.example.jingdong.ui.shopcar.adapter;

import android.app.ProgressDialog;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.example.jingdong.R;
import com.example.jingdong.bean.SellerBean;
import com.example.jingdong.bean.ShopCarBean;
import com.example.jingdong.ui.shopcar.presenter.ShopCarPresenter;
import com.example.jingdong.ui.widget.AddSubView;
import com.example.jingdong.util.SpUtil;

import java.util.List;

public class ElvShopCarAdapter extends BaseExpandableListAdapter{

    private List<SellerBean> groupList;
    private List<List<ShopCarBean.DataBean.ListBean>> childList;
    private Context context;
    private ShopCarPresenter shopCarPresenter;
    private final LayoutInflater inflater;
    private ProgressDialog progressDialog;
    private int productIndex;
    private int groupPosition;
    private static final int GETCARS = 0;//查询购物车
    private static final int UPDATE_PRODUCT = 1;//更新商品
    private static final int UPDATE_SELLER = 2;//更新卖家
    private static int state = GETCARS;
    private final String uid;
    private final String token;
    private boolean checked;
    private boolean allChecked;

    public ElvShopCarAdapter(List<SellerBean> groupList, List<List<ShopCarBean.DataBean.ListBean>> childList, Context context, ShopCarPresenter shopCarPresenter, ProgressDialog progressDialog) {
        this.groupList = groupList;
        this.childList = childList;
        this.context = context;
        this.shopCarPresenter = shopCarPresenter;
        this.progressDialog = progressDialog;
        inflater=LayoutInflater.from(context);
        //获取uid和token
        uid = SpUtil.getString(context, "uid", "");
        token = SpUtil.getString(context, "token", "");
    }

    @Override
    public int getGroupCount() {
        return groupList.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return childList.get(groupPosition).size();
    }

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

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

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

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

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

    @Override
    public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        final GroupViewHolder groupViewHolder;
        if (convertView == null) {
            convertView = View.inflate(context, R.layout.elv_shopcarseller_item, null);
            groupViewHolder = new GroupViewHolder(convertView);
            convertView.setTag(groupViewHolder);
        } else {
            groupViewHolder = (GroupViewHolder) convertView.getTag();
        }
        //设置是否全部选中
        groupViewHolder.ck_seller.setChecked(groupList.get(groupPosition).isSelected());
        //设置数据
        groupViewHolder.tv_sellername.setText(groupList.get(groupPosition).getSellerName());

        //给商家的CheckBox设置点击事件
        groupViewHolder.ck_seller.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                state = UPDATE_PRODUCT;
                //显示进度条
                progressDialog.show();
                //默认从第一个商品开始更新购物车状态
                productIndex = 0;
                //全局记录一下当前更新的商家
                ElvShopCarAdapter.this.groupPosition = groupPosition;
                //该商家是否选中
                checked = groupViewHolder.ck_seller.isChecked();
                //更新商家下的商品状态
                updateProductInSeller();
            }
        });
        return convertView;
    }

    @Override
    public View getChildView(final int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        final ChildViewHolder childViewHolder;
        if (convertView == null) {
            convertView = View.inflate(context, R.layout.elv_shopcarsellerpro_item, null);
            childViewHolder = new ChildViewHolder(convertView);
            convertView.setTag(childViewHolder);
        } else {
            childViewHolder = (ChildViewHolder) convertView.getTag();
        }
        //获取单个子商品
        final ShopCarBean.DataBean.ListBean listBean = childList.get(groupPosition).get(childPosition);
        //根据服务器返回的select值,给CheckBox设置是否选中
        childViewHolder.ck_product.setChecked(listBean.getSelected() == 1 ? true : false);
        //设置数据
        childViewHolder.tv_producttitle.setText(listBean.getTitle());
        childViewHolder.tv_productprice.setText("¥" + listBean.getPrice() + "");
        Glide.with(context).load(listBean.getImages().split("\\|")[0]).into(childViewHolder.img_product);
        //设置数量
        childViewHolder.addsubcar.setNum(listBean.getNum() + "");
        //给子条目的CheckBox设置点击事件
        childViewHolder.ck_product.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressDialog.show();
                state = GETCARS;
                ElvShopCarAdapter.this.groupPosition = groupPosition;
                //获取sellerid
                String sellerid = groupList.get(groupPosition).getSellerid();
                //获取pid
                String pid = listBean.getPid() + "";
                String num = listBean.getNum() + "";
                //是否选中
                boolean childChecked = childViewHolder.ck_product.isChecked();
                //更新购物车
                shopCarPresenter.updateShopCar(uid, sellerid, pid, num, childChecked ? "1" : "0", token);
            }
        });

        //给加号设置点击事件
        childViewHolder.addsubcar.setAddOnclickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressDialog.show();
                state = GETCARS;
                //获取sellerid
                String sellerid = groupList.get(groupPosition).getSellerid();
                //获取pid
                int pid = listBean.getPid();
                //获取数量
                int num = listBean.getNum();
                num++;
                //是否选中
                String isChecked = childViewHolder.ck_product.isChecked() ? "1" : "0";
                //调用更新购物车的接口
                shopCarPresenter.updateShopCar(uid, sellerid, pid + "", num + "", isChecked, token);
            }
        });

        //给减号设置点击事件
        childViewHolder.addsubcar.setSubOnclickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressDialog.show();
                state = GETCARS;
                //获取当前商品的数量
                int num = listBean.getNum();
                if (num <= 1) {
                    progressDialog.dismiss();
                    Toast.makeText(context, "数量不能小于1!", Toast.LENGTH_SHORT).show();
                } else {
                    num--;
                    //获取sellerid
                    String sellerid = groupList.get(groupPosition).getSellerid();
                    //获取pid
                    String pid = listBean.getPid() + "";
                    //是否选中
                    String isChecked = childViewHolder.ck_product.isChecked() ? "1" : "0";
                    //更新服务器上购物车状态
                    shopCarPresenter.updateShopCar(uid, sellerid, pid, num + "", isChecked, token);
                }
            }
        });

        //给删除设置点击事件
        childViewHolder.tv_del.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressDialog.show();
                state = GETCARS;
                //获取商品的pid
                int pid = listBean.getPid();
                //开始删除购物车里的选项
                shopCarPresenter.delShopCar(uid, pid + "", token);
            }
        });

        return convertView;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return false;
    }

    //父控件的viewholder
    public static class GroupViewHolder {
        public View rootView;
        public CheckBox ck_seller;
        public TextView tv_sellername;

        public GroupViewHolder(View rootView) {
            this.rootView = rootView;
            this.ck_seller = (CheckBox) rootView.findViewById(R.id.ck_seller);
            this.tv_sellername = (TextView) rootView.findViewById(R.id.tv_sellername);
        }
    }

    //子控件的viewholder
    public static class ChildViewHolder {
        public View rootView;
        public CheckBox ck_product;
        public TextView tv_del;
        public ImageView img_product;
        public TextView tv_producttitle;
        public TextView tv_productprice;
        public AddSubView addsubcar;

        public ChildViewHolder(View rootView) {
            this.rootView = rootView;
            this.ck_product = (CheckBox) rootView.findViewById(R.id.ck_product);
            this.tv_del = (TextView) rootView.findViewById(R.id.tv_del);
            this.img_product = (ImageView) rootView.findViewById(R.id.img_product);
            this.tv_producttitle = (TextView) rootView.findViewById(R.id.tv_producttitle);
            this.tv_productprice = (TextView) rootView.findViewById(R.id.tv_productprice);
            this.addsubcar = (AddSubView) rootView.findViewById(R.id.addsubcar);
        }
    }

    //更新购物车成功的回调
    public void updateSuccess() {
        switch (state) {
            case GETCARS:
                //更新成功后调用查询购物车接口
                productIndex = 0;
                groupPosition = 0;
                shopCarPresenter.getShopCar(uid, token);
                break;
            case UPDATE_PRODUCT:
                //更新成功一个商品以后,再接着更新该商家下的其他商品,直到没有商品为止
                productIndex++;
                //判断下标是否越界
                if (productIndex < childList.get(groupPosition).size()) {
                    //可以继续更新商品
                    updateProductInSeller();
                } else {
                    //商品已经全部更新完查询购物车
                    state = GETCARS;
                    updateSuccess();
                }
                break;
            case UPDATE_SELLER:
                //遍历所有商家下的商品,并更新状态
                productIndex++;
                //下标是否越界
                if (productIndex<childList.get(groupPosition).size()){
                    //可以继续更新商品
                    updateProductInSeller(allChecked);
                }else {
                    //第一个商家的商品已经全部更新完,请查询购物车
                    productIndex=0;
                    groupPosition++;
                    if (groupPosition<groupList.size()){
                        //可以继续更新商品
                        updateProductInSeller(allChecked);
                    }else {
                        //所有商家的所有商品已经全部更新完,查询购物车
                        state=GETCARS;
                        updateSuccess();
                    }
                }
                break;
        }
    }

    //删除购物车成功的回调
    public void delSuccess() {
        //查询购物车
        shopCarPresenter.getShopCar(uid, token);
    }

    //更新商家下的商品状态
    private void updateProductInSeller() {
        //获取sellerid
        SellerBean sellerBean = groupList.get(groupPosition);
        String sellerid = sellerBean.getSellerid();
        //获取pid
        ShopCarBean.DataBean.ListBean listBean = childList.get(groupPosition).get(productIndex);
        int pid = listBean.getPid();
        int num = listBean.getNum();
        //开始更新
        shopCarPresenter.updateShopCar(uid, sellerid, pid + "", num + "", checked ? "1" : "0", token);
    }

    private void updateProductInSeller(boolean bool) {
        //获取sellerid
        SellerBean sellerBean = groupList.get(groupPosition);
        String sellerid = sellerBean.getSellerid();
        //获取pid
        ShopCarBean.DataBean.ListBean listBean = childList.get(groupPosition).get(productIndex);
        int pid = listBean.getPid();
        int num = listBean.getNum();
        //开始更新
        shopCarPresenter.updateShopCar(uid, sellerid, pid + "", num + "", bool ? "1" : "0", token);
    }

    //计算数量和价钱
    public String[] computeMoneyAndNum() {
        double sum = 0;
        int num = 0;
        for (int i = 0; i < groupList.size(); i++) {
            for (int j = 0; j < childList.get(i).size(); j++) {
                //判断商品是否选中
                ShopCarBean.DataBean.ListBean listBean = childList.get(i).get(j);
                if (listBean.getSelected() == 1) {
                    //该商品为选中状态
                    sum += listBean.getPrice() * listBean.getNum();
                    num += listBean.getNum();
                }
            }
        }
        return new String[]{sum + "", num + ""};
    }

    //全选复选框更新状态
    public void changeAllState(boolean bool) {
        this.allChecked = bool;
        state = UPDATE_SELLER;
        //遍历商家下的商品修改状态
        updateProductInSeller(bool);
    }


}

7.父条目布局

<?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="33dp"
    android:gravity="center_vertical"
    android:orientation="horizontal">

    <CheckBox
        android:id="@+id/ck_seller"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="2dp"/>

    <TextView
        android:id="@+id/tv_sellername"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="2dp"/>


</LinearLayout>

8.子条目布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="2dp">

    <CheckBox
        android:id="@+id/ck_product"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="12dp" />

    <TextView
        android:id="@+id/tv_del"
        android:layout_width="45dp"
        android:layout_height="30dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="5dp"
        android:background="#ff0000"
        android:gravity="center"
        android:text="删除"
        android:textColor="#fff" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_toLeftOf="@id/tv_del"
        android:layout_toRightOf="@id/ck_product"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/img_product"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_gravity="center_vertical" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="2dp"
            android:layout_marginLeft="2dp"
            android:layout_marginTop="2dp"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tv_producttitle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="title"
                android:lines="2"
                android:ellipsize="end"
                android:textSize="11sp" />

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <TextView
                    android:id="@+id/tv_productprice"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true"
                    android:text="12312"
                    android:textColor="#f00"
                    android:textSize="10sp" />

                <com.example.jingdong.ui.widget.AddSubView
                    android:id="@+id/addsubcar"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true"
                    android:layout_alignParentRight="true"
                    android:layout_marginRight="3dp"></com.example.jingdong.ui.widget.AddSubView>

            </RelativeLayout>
        </LinearLayout>
    </LinearLayout>

</RelativeLayout>

9.自定义加减器AddSubView

package com.example.jingdong.ui.widget;

import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.example.jingdong.R;

public class AddSubView extends LinearLayout {
    private TextView tv_productSub;
    private TextView tv_productNum;
    private TextView tv_productAdd;

    public AddSubView(Context context) {
        this(context, null);
    }

    public AddSubView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        View view = LayoutInflater.from(context).inflate(R.layout.add_sub_view, this);
        tv_productSub=view.findViewById(R.id.tv_productSub);
        tv_productNum=view.findViewById(R.id.tv_productNum);
        tv_productAdd=view.findViewById(R.id.tv_productAdd);
    }

    public String getNum() {
        return tv_productNum.getText().toString();
    }

    public void setNum(String str) {
        tv_productNum.setText(str);
    }

    //给加号设置点击事件
    public void setAddOnclickListener(OnClickListener onclickListener){
        tv_productAdd.setOnClickListener(onclickListener);
    }

    //给减号设置点击事件
    public void setSubOnclickListener(OnClickListener onclickListener){
        tv_productSub.setOnClickListener(onclickListener);
    }
}

10.自定义加减器AddSubView布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/tv_productSub"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/cart_biankuang"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:text="-"
        android:textSize="12sp" />

    <TextView
        android:id="@+id/tv_productNum"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/cart_biankuang"
        android:paddingLeft="3dp"
        android:paddingRight="3dp"
        android:text="12"
        android:textSize="12sp" />

    <TextView
        android:id="@+id/tv_productAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/cart_biankuang"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:text="+"
        android:textSize="12sp" />

</LinearLayout>

11.加减器边框shape

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#ffffff" />
    <stroke
        android:width="0.1dp"
        android:color="#000000" />
</shape>

12.商家的bean类

package com.example.jingdong.bean;

public class SellerBean {
    private String sellerName;
    private String sellerid;
    private boolean selected;//商家是否选中

    public boolean isSelected() {
        return selected;
    }

    public void setSelected(boolean selected) {
        this.selected = selected;
    }

    public String getSellerName() {
        return sellerName;
    }

    public void setSellerName(String sellerName) {
        this.sellerName = sellerName;
    }

    public String getSellerid() {
        return sellerid;
    }

    public void setSellerid(String sellerid) {
        this.sellerid = sellerid;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值