Android仿京东购物车-----完整代码(三)

activity

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    ExpandableListView expandableListView;
    Context context;
    private CheckBox checkall;
    private TextView allpay;
    private TextView allprice;
    private TextView allnum;
    private MyAdapter myAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = MainActivity.this;


        initView();
        initData();


    }

    private void initView() {
        expandableListView = findViewById(R.id.main_expand);
        checkall = findViewById(R.id.main_check);
        allnum = findViewById(R.id.main_numb);
        allprice = findViewById(R.id.main_price);
        allpay = findViewById(R.id.main_pay);
        checkall.setOnClickListener(this);

    }

    private void initData() {
        String url = "https://www.zhaoapi.cn/product/getCarts?uid=71";
        new OkHttpClient.Builder().build().newCall(new Request.Builder().url(url).build()).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(final Call call, Response response) throws IOException {
                final String responses = response.body().string();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //解析数据
                        Gson gson = new Gson();
                        MyBean myBean = gson.fromJson(responses, MyBean.class);
                        List data = myBean.getData();
                        myAdapter = new MyAdapter(context, data);
                        expandableListView.setAdapter(myAdapter);
                        //把所有二级列表进行展开
                        for (int i = 0; i < data.size(); i++) {
                            expandableListView.expandGroup(i);

                        }
                        //适配器的接口回调
                        myAdapter.setOnChangeLinsenter(new MyAdapter.OnChangeLinsenter() {
                            @Override
                            public void shopChange(int i) {
                                boolean shop = myAdapter.isShop(i);
                                myAdapter.shopall(i, !shop);
                                myAdapter.notifyDataSetChanged();
                                refreshall();
                            }

                            @Override
                            public void goodChange(int i, int i1) {
                                myAdapter.goodselect(i, i1);
                                myAdapter.notifyDataSetChanged();
                                refreshall();
                            }

                            @Override
                            public void goodnumChange(int i, int i1, int num) {
                                myAdapter.numshange(i, i1, num);
                                myAdapter.notifyDataSetChanged();
                                refreshall();
                            }
                        });
                    }
                });
            }
        });
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            //全选按钮的点击事件
            case R.id.main_check:
                //调用适配器的方法状态 并赋值
                boolean allChecked = myAdapter.isAllChecked();
                myAdapter.changeAll(!allChecked);
                //刷新适配器
                myAdapter.notifyDataSetChanged();
                //调取刷新全选的方法
                refreshall();
                break;
        }
    }

    //写一个方法 专门去进行  全选  所有数量 以及总价
    private void refreshall() {
        boolean allChecked = myAdapter.isAllChecked();
        checkall.setChecked(allChecked);

        double allprie = myAdapter.allPrice();
        allprice.setText("总价为:¥" + allprie);

        int snum = myAdapter.allNum();
        allnum.setText("共" + snum + "件商品");
    }
}

adapter

/**
 * 适配器中
 * 展示页面
 * 做一些逻辑判断(通过接口回调)
 */
public class MyAdapter extends BaseExpandableListAdapter {

    List data;
    Context context;

    public MyAdapter(Context context, List data) {
        this.context = context;
        this.data = data;
    }

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

    @Override
    public int getChildrenCount(int i) {
        return data.get(i).getList().size();
    }

    @Override
    public Object getGroup(int i) {
        return null;
    }

    @Override
    public Object getChild(int i, int i1) {
        return null;
    }

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

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

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

    //设置外层-----商家
    @Override
    public View getGroupView(final int i, boolean b, View view, ViewGroup viewGroup) {
        //定义Holder
        GroupViewHolder groupViewHolder = null;
        if (view == null) {
            groupViewHolder = new GroupViewHolder();
            view = View.inflate(context, R.layout.grouplayout, null);
            groupViewHolder.group_checkBox = view.findViewById(R.id.group_check);
            groupViewHolder.group_textView = view.findViewById(R.id.group_name);
            view.setTag(groupViewHolder);
        } else {
            groupViewHolder = (GroupViewHolder) view.getTag();
        }
        //赋值商家名称
        groupViewHolder.group_textView.setText(data.get(i).getSellerName());
        //得到那个方法的状态并赋值给适配器的状态
        boolean shop = isShop(i);
        groupViewHolder.group_checkBox.setChecked(shop);

        /**
         * 通过点击事件  返回出接口
         */
        groupViewHolder.group_checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (onChangeLinsenter != null) {
                    onChangeLinsenter.shopChange(i);
                }
            }
        });

        return view;
    }

    //判断商家的选中状态 进行判断
    public boolean isShop(int i) {
        //遍历子条目 判断下面的商家状态
        List list = data.get(i).getList();
        for (int j = 0; j < list.size(); j++) {
            if (list.get(j).getSelected() == 0) {
                return false;
            }
        }
        return true;
    }

    //设置子层-----商品
    @Override
    public View getChildView(final int i, final int i1, boolean b, View view, ViewGroup viewGroup) {
        ChildViewHolder childViewHolder = null;

        if (view == null) {
            childViewHolder = new ChildViewHolder();
            view = View.inflate(context, R.layout.childlayout, null);
            childViewHolder.child_checkBox = view.findViewById(R.id.child_check);
            childViewHolder.child_image = view.findViewById(R.id.child_image);
            childViewHolder.child_name = view.findViewById(R.id.child_name);
            childViewHolder.child_price = view.findViewById(R.id.child_price);
            childViewHolder.myView = view.findViewById(R.id.child_myview);
            view.setTag(childViewHolder);
        } else {
            childViewHolder = (ChildViewHolder) view.getTag();
        }

        childViewHolder.child_name.setText(data.get(i).getList().get(i1).getTitle());
        double price = data.get(i).getList().get(i1).getPrice();
        String prices = String.valueOf(price);
        childViewHolder.child_price.setText("¥" + prices);
        String images = data.get(i).getList().get(i1).getImages();
        if (images.contains("|")) {
            String[] split = images.split("\\|");
            Picasso.with(context).load(split[0]).into(childViewHolder.child_image);
        } else {
            Picasso.with(context).load(images).into(childViewHolder.child_image);
        }

        //获取商品的判断状态并返回出去
        List list = data.get(i).getList();
        childViewHolder.child_checkBox.setChecked(list.get(i1).getSelected() == 1);
        childViewHolder.child_checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onChangeLinsenter.goodChange(i, i1);
            }
        });
        //这是 接口回调中的  数量照片
        childViewHolder.myView.setOnNumChange(new MyView.onNumChange() {
            @Override
            public void onNumberChange(int number) {
                onChangeLinsenter.goodnumChange(i, i1, number);
            }
        });

        return view;
    }

    //在接口回调后商家使用的方法
    public void shopall(int i, boolean b) {
        List list = data.get(i).getList();
        for (int j = 0; j < list.size(); j++) {
            list.get(j).setSelected(b ? 1 : 0);
        }
    }

    //在接口回调后商品使用的方法
    public void goodselect(int i, int i1) {
        MyBean.DataBean.ListBean listBean = data.get(i).getList().get(i1);
        listBean.setSelected(listBean.getSelected() == 0 ? 1 : 0);
    }

    //在接口回调后数量改变使用的方法
    public void numshange(int i, int i1, int number) {
        MyBean.DataBean.ListBean listBean = data.get(i).getList().get(i1);
        listBean.setNum(number);
    }
    //得到所有商品数量的方法
    public int allNum() {
        int numa = 0;
        for (int i = 0; i < data.size(); i++) {
            List list = data.get(i).getList();
            for (int j = 0; j < list.size(); j++) {
                if (list.get(j).getSelected() == 1) {
                    int num = list.get(j).getNum();
                    numa += num;
                }
            }
        }

        return numa;
    }
    //得到所有价格的方法
    public double allPrice() {
        double allpro = 0;
        for (int i = 0; i < data.size(); i++) {
            List list = data.get(i).getList();
            for (int j = 0; j < list.size(); j++) {
                if (list.get(j).getSelected() == 1) {
                    double price = list.get(j).getPrice();
                    int num = list.get(j).getNum();
                    allpro += price * num;
                }
            }
        }
        return allpro;
    }

    //判断全选按钮并设置对应的处理的方法
    public boolean isAllChecked() {
        for (int i = 0; i < data.size(); i++) {
            List list = data.get(i).getList();
            for (int j = 0; j < list.size(); j++) {
                if (list.get(j).getSelected() == 0) {
                    return false;
                }
            }
        }
        return true;
    }
    //全局全选按钮状态改变之后调取的方法
    public void changeAll(boolean b) {
        for (int i = 0; i < data.size(); i++) {
            List list = data.get(i).getList();
            for (int j = 0; j < list.size(); j++) {
                list.get(j).setSelected(b ? 1 : 0);
            }
        }
    }

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

    //设置外层ViewHolder
    public static class GroupViewHolder {
        CheckBox group_checkBox;
        TextView group_textView;
    }

    //设置子层ViewHolder
    public static class ChildViewHolder {
        CheckBox child_checkBox;
        TextView child_name, child_price;
        ImageView child_image;
        MyView myView;
    }

    OnChangeLinsenter onChangeLinsenter;

    //设置对外层开放的方法 用于调取接口
    public void setOnChangeLinsenter(OnChangeLinsenter onChangeLinsenter) {
        this.onChangeLinsenter = onChangeLinsenter;
    }

    //设置接口 控制商家商品数量
    public interface OnChangeLinsenter {

        void shopChange(int i);

        void goodChange(int i, int i1);

        void goodnumChange(int i, int i1, int num);
    }

}

自定义视图

//自定义加减器按钮
public class MyView extends LinearLayout implements View.OnClickListener {

    TextView tv_sub_view;
    TextView tv_number_view;
    TextView tv_add_view;

    private int number = 1;

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
        tv_number_view.setText(number + "");
    }

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

    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        View inflate = LayoutInflater.from(context).inflate(R.layout.myviewlayout, this);

        tv_sub_view = inflate.findViewById(R.id.dec);
        tv_number_view = inflate.findViewById(R.id.num);
        tv_add_view = inflate.findViewById(R.id.add);
        //设置点击事件
        tv_sub_view.setOnClickListener(this);
        tv_add_view.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        switch (view.getId()) {
            case R.id.dec:
                if (number > 1) {
                    --number;
                    tv_number_view.setText(number + "");
                    if (onNumChange != null) {
                        onNumChange.onNumberChange(number);
                    }
                } else {
                    Toast.makeText(getContext(), "不能小于1", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.add:
                ++number;
                tv_number_view.setText(number + "");
                if (onNumChange != null) {
                    onNumChange.onNumberChange(number);
                }
                break;
        }
    }

    onNumChange onNumChange;

    public void setOnNumChange(MyView.onNumChange onNumChange) {
        this.onNumChange = onNumChange;
    }

    public interface onNumChange {
        void onNumberChange(int number);
    }
}

自定义view布局



    

    

    


 

你可能感兴趣的:(Android仿京东购物车-----完整代码(三))