购物车

package com.example.kson.cart;


import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.TextView;


import com.example.kson.cart.adapter.CartAdapter;
import com.example.kson.cart.api.CartApi;
import com.example.kson.cart.bean.CartEntity;
import com.example.kson.cart.common.Constants;
import com.example.kson.cart.i.onCheckListener;


import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;


import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;


public class MainActivity extends AppCompatActivity implements onCheckListener {
    private ExpandableListView expandableListView;
    private CheckBox checkBox;
    private TextView priceTv;
    CartAdapter cartAdapter;
    CartEntity cart;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        loadData();
    }


    /**
     * 网络请求购物车数据
     */
    private void loadData() {


        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constants.BASE_URL)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();


        CartApi cartApi = retrofit.create(CartApi.class);


        cartApi.getData("71").subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<CartEntity>() {
            @Override
            public void onSubscribe(Disposable d) {


            }


            @Override
            public void onNext(CartEntity cartEntity) {
                System.out.println("cartentity:" + cartEntity.code);
                cart = cartEntity;
                fillData();
            }


            @Override
            public void onError(Throwable e) {
                System.out.println("Throwable:" + e + "");
            }


            @Override
            public void onComplete() {


            }
        });




    }




    /**
     *
     */
    private void fillData() {


        cartAdapter = new CartAdapter(this, cart);
        expandableListView.setAdapter(cartAdapter);
        for (int i = 0; i < cart.data.size(); i++) {
            expandableListView.expandGroup(i);
        }


        cartAdapter.setOnCheckListener(this);
    }


    private void initView() {


        expandableListView = findViewById(R.id.elv);
        checkBox = findViewById(R.id.all_checkbox);
        priceTv = findViewById(R.id.total_price);


        checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!checkBox.isChecked()) {
                    for (int i = 0; i < cart.data.size(); i++) {
                        cart.data.get(i).setGroupChecked(false);
                        for (int i1 = 0; i1 < cart.data.get(i).list.size(); i1++) {
                            cart.data.get(i).list.get(i1).setChildChecked(false);
                        }
                    }


                } else {
                    for (int i = 0; i < cart.data.size(); i++) {
                        cart.data.get(i).setGroupChecked(true);
                        for (int i1 = 0; i1 < cart.data.get(i).list.size(); i1++) {
                            cart.data.get(i).list.get(i1).setChildChecked(true);
                        }
                    }
                }
                cartAdapter.notifyDataSetChanged();
                //总价计算
                total();
            }
        });




    }


    /**
     * 选中group复选框
     *
     * @param grouppostion
     */
    @Override
    public void groupClick(int grouppostion) {
        if (cart != null && cart.data.size() > 0) {
            CartEntity.ShopEntity shopEntity = cart.data.get(grouppostion);
            boolean isChecked = !shopEntity.isGroupChecked();
            shopEntity.setGroupChecked(isChecked);
            for (int i = 0; i < shopEntity.list.size(); i++) {
                CartEntity.ShopEntity.ProductEntity productEntity = shopEntity.list.get(i);
                productEntity.setChildChecked(isChecked);
                shopEntity.list.set(i, productEntity);
            }
            cart.data.set(grouppostion, shopEntity);
            cartAdapter.notifyDataSetChanged();
            //总价计算
            total();


        }




    }


    /**
     * 选中child复选框
     *
     * @param groupPostion
     * @param childPos
     */
    @Override
    public void childClick(int groupPostion, int childPos) {
        CartEntity.ShopEntity.ProductEntity productEntity = cart.data.get(groupPostion).list.get(childPos);
        boolean childChecked = !productEntity.isChildChecked();
        productEntity.setChildChecked(childChecked);
        boolean groupChecked = true;
        for (int i = 0; i < cart.data.get(groupPostion).list.size(); i++) {
            if (!cart.data.get(groupPostion).list.get(childPos).isChildChecked()) {
                groupChecked = false;
            }
        }
        CartEntity.ShopEntity shopEntity = cart.data.get(groupPostion);
        shopEntity.setGroupChecked(groupChecked);
        cart.data.set(groupPostion, shopEntity);
        cartAdapter.notifyDataSetChanged();
        total();
    }


    @Override
    public void totalNumPrice() {
        total();
    }




    private void total() {
        List<Double> prices = new ArrayList<>();
        for (int i = 0; i < cartAdapter.getCartEntity().data.size(); i++) {
            for (int i1 = 0; i1 < cartAdapter.getCartEntity().data.get(i).list.size(); i1++) {
                CartEntity.ShopEntity.ProductEntity productEntity = cartAdapter.getCartEntity().data.get(i).list.get(i1);
                System.out.println("price:" + productEntity.price + " num:" + productEntity.num);
                if (productEntity.isChildChecked()) {
                    prices.add(productEntity.price * productEntity.num);
                }
            }


        }
        priceTv.setText("价格:¥" + add(prices) + "");
    }


    /**
     * 提供精确加法计算的add方法
     *
     * @param values 值几何
     * @return 累加的和
     */
    public static double add(List<Double> values) {
        double sum = 0;
        for (int i = 0; i < values.size(); i++) {
            double value = values.get(i);
            BigDecimal b1 = new BigDecimal(Double.toString(sum));
            BigDecimal b2 = new BigDecimal(Double.toString(value));
            sum = b1.add(b2).doubleValue();
        }


        return sum;
    }

}

-------------------------------------------------------------------------------------------------------------------------

package com.example.kson.cart.widget;


import android.content.Context;
import android.media.Image;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;


import com.example.kson.cart.R;


/**
 * Author:kson
 * E-mail:19655910@qq.com
 * Time:2018/06/28
 * Description:
 */
public class AddSubView extends LinearLayout {
    private ImageView add, sub;
    private EditText num;


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


    public AddSubView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }


    public AddSubView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }


    private void init(Context context, AttributeSet attributeSet) {
//加载布局
        View view = LayoutInflater.from(context).inflate(R.layout.add_sub_layout, this, true);
//        addView(view);
        add = view.findViewById(R.id.add_btn);
        sub = view.findViewById(R.id.sub_btn);
        num = view.findViewById(R.id.num_et);


        sub.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {


                onAddSubClicklistener.sub(v, Integer.parseInt(num.getText().toString()));




            }
        });


        add.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                onAddSubClicklistener.add(v, Integer.parseInt(num.getText().toString()));


            }
        });




    }


    public void setText(int i){
        num.setText(i+"");
    }


    public onAddSubClicklistener onAddSubClicklistener;


    public void setOnAddSubClicklistener(AddSubView.onAddSubClicklistener onAddSubClicklistener) {
        this.onAddSubClicklistener = onAddSubClicklistener;
    }


    public interface onAddSubClicklistener {
        void add(View v, int num);


        void sub(View v, int num);
    }




}

-------------------------------------------------------------------------------------------------------------------------


package com.example.kson.cart.adapter;


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.example.kson.cart.R;
import com.example.kson.cart.bean.CartEntity;
import com.example.kson.cart.i.onCheckListener;
import com.example.kson.cart.widget.AddSubView;


/**
 * Author:kson
 * E-mail:19655910@qq.com
 * Time:2018/06/28
 * Description:
 */
public class CartAdapter extends BaseExpandableListAdapter implements View.OnClickListener {


    private Context context;
    private CartEntity cartEntity;
    private onCheckListener onCheckListener;


    public void setOnCheckListener(com.example.kson.cart.i.onCheckListener onCheckListener) {
        this.onCheckListener = onCheckListener;
    }


    public CartEntity getCartEntity() {
        return cartEntity;
    }


    public CartAdapter(Context context, CartEntity cartEntity) {
        this.context = context;
        this.cartEntity = cartEntity;
    }


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


    @Override
    public int getChildrenCount(int groupPosition) {
        return cartEntity.data.get(groupPosition).list.size();
    }


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


    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return cartEntity.data.get(groupPosition).list.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 false;
    }


    @Override
    public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        GroupHolder groupHolder = null;
        if (convertView
                == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.group_item_layout, parent, false);
            groupHolder = new GroupHolder();
            convertView.setTag(groupHolder);
            groupHolder.goupchexbox = convertView.findViewById(R.id.group_checkbox);
            groupHolder.nameTV = convertView.findViewById(R.id.group_name);


        } else {
            groupHolder = (GroupHolder) convertView.getTag();
        }


        groupHolder.goupchexbox.setChecked(cartEntity.data.get(groupPosition).isGroupChecked());


        groupHolder.nameTV.setText(cartEntity.data.get(groupPosition).sellerName);


        //设置tag
        groupHolder.goupchexbox.setTag(R.id.group_id_tag, groupPosition);
        groupHolder.goupchexbox.setOnClickListener(this);
        return convertView;
    }


    @Override
    public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ChildHolder childHolder = null;
        if (convertView
                == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.child_item_layout, parent, false);
            childHolder = new ChildHolder();
            convertView.setTag(childHolder);
            childHolder.childchexbox = convertView.findViewById(R.id.child_checkbox);
            childHolder.iconIv = convertView.findViewById(R.id.child_icon);
            childHolder.nameTV = convertView.findViewById(R.id.child_name);
            childHolder.priceTv = convertView.findViewById(R.id.child_price);
            childHolder.addSubView = convertView.findViewById(R.id.addSubview);


        } else {
            childHolder = (ChildHolder) convertView.getTag();
        }


        final ChildHolder finalChildHolder = childHolder;
        childHolder.addSubView.setOnAddSubClicklistener(new AddSubView.onAddSubClicklistener() {
            int i = 0;


            @Override
            public void add(View v, int num) {
                i = num;
                i++;
                finalChildHolder.addSubView.setText(i);


                cartEntity.data.get(groupPosition).list.get(childPosition).num = i;


                onCheckListener.totalNumPrice();


            }


            @Override
            public void sub(View v, int num) {


                i = num;
                i--;
                if (i < 1) {
                    i = 1;
                    Toast.makeText(v.getContext(), "不能再减了", Toast.LENGTH_SHORT).show();
                }


                finalChildHolder.addSubView.setText(i);
                CartEntity.ShopEntity.ProductEntity productEntity = cartEntity.data.get(groupPosition).list.get(childPosition);
                productEntity.num = i;
                cartEntity.data.get(groupPosition).list.set(childPosition,productEntity);


                onCheckListener.totalNumPrice();




            }
        });
        childHolder.nameTV.setText(cartEntity.data.get(groupPosition).list.get(childPosition).title);


        childHolder.priceTv.setText(cartEntity.data.get(groupPosition).list.get(childPosition).price + "");


        childHolder.childchexbox.setChecked(cartEntity.data.get(groupPosition).list.get(childPosition).isChildChecked());


        childHolder.childchexbox.setTag(R.id.child_id_tag, childPosition);
        childHolder.childchexbox.setTag(R.id.group_id_tag, groupPosition);
        childHolder.childchexbox.setOnClickListener(this);
        return convertView;
    }




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


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.group_checkbox:
                onCheckListener.groupClick((Integer) v.getTag(R.id.group_id_tag));
                break;
            case R.id.child_checkbox:
                onCheckListener.childClick((Integer) v.getTag(R.id.group_id_tag), (Integer) v.getTag(R.id.child_id_tag));


                break;
        }
    }


    /**
     * 父viewholder
     */
    private static class GroupHolder {
        CheckBox goupchexbox;
        TextView nameTV;




    }


    /**
     * 子viewholder
     */
    private static class ChildHolder {
        CheckBox childchexbox;
        TextView nameTV, priceTv;
        ImageView iconIv;
        AddSubView addSubView;


    }

}

-------------------------------------------------------------------------------------------------------------------------



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值