1. 程式人生 > >Android仿京東購物車-----完整程式碼(三)

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<MyBean.DataBean> 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<MyBean.DataBean> data;
    Context context;

    public MyAdapter(Context context, List<MyBean.DataBean> 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<MyBean.DataBean.ListBean> 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<MyBean.DataBean.ListBean> 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<MyBean.DataBean.ListBean> 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<MyBean.DataBean.ListBean> 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<MyBean.DataBean.ListBean> 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<MyBean.DataBean.ListBean> 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<MyBean.DataBean.ListBean> 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佈局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="80dp"
    android:layout_height="30dp"
    android:background="#000"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:padding="2dp">

    <TextView
        android:id="@+id/dec"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="#fff"
        android:gravity="center"
        android:text="-" />

    <TextView
        android:id="@+id/num"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_marginLeft="2dp"
        android:layout_marginRight="2dp"
        android:layout_weight="1"
        android:background="#fff"
        android:gravity="center"
        android:text="1" />

    <TextView
        android:id="@+id/add"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="#fff"
        android:gravity="center"
        android:text="+" />

</LinearLayout>