Recently, the company’s project to do the mall module, need to realize the shopping cart function, mainly to realize the single selection, all selection, total amount, commodity deletion, commodity quantity addition and subtraction and other functions, let’s take a look at the effect picture:

Ii. Implementation Process:

0. Add a dependency library

    implementation 'com. Jakewharton: butterknife: 5.1.1'
    implementation 'com. Google. Code. Gson: gson: 2.2.4'
    implementation 'com. Making. Bumptech. Glide: glide: 3.7.0'
Copy the code

1. Shopping owner interface layout file (Activity_main.xml)

<? 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="match_parent"
    android:background="#ffffff"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/ll_gouwuche"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ededed"
        android:orientation="vertical">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:background="#ffffff"
            android:orientation="vertical">


            <ImageView
                android:id="@+id/tv_titlebar_left"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="15dp"
                android:padding="5dp"
                android:src="@drawable/danghanglan_fanhui" />

            <TextView
                android:id="@+id/tv_titlebar_center"
                android:layout_width="200dp"
                android:layout_height="match_parent"
                android:layout_centerHorizontal="true"
                android:ellipsize="end"
                android:gravity="center"
                android:maxLength="18"
                android:singleLine="true"
                android:text="Shopping cart"
                android:textColor="#2f302b"
                android:textSize="17sp"
                android:visibility="visible" />

            <TextView
                android:id="@+id/tv_titlebar_right"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_alignParentRight="true"
                android:background="@null"
                android:gravity="center"
                android:paddingLeft="15dp"
                android:paddingRight="15dp"
                android:singleLine="true"
                android:text="Edit"
                android:textColor="#2f302b"
                android:textSize="14sp"
                android:visibility="gone" />

            <View
                android:layout_width="match_parent"
                android:layout_height="0.5 dp"
                android:layout_alignParentBottom="true"
                android:background="#cccccc" />
        </RelativeLayout>

        <ExpandableListView
            android:id="@+id/elv_shopping_car"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="#ededed"
            android:divider="@null"
            android:groupIndicator="@null"
            android:scrollbars="none"
            android:visibility="gone" />

        <RelativeLayout
            android:id="@+id/rl"
            android:layout_width="match_parent"
            android:layout_height="54dp"
            android:background="#ffffff"
            android:visibility="gone">

            <LinearLayout
                android:id="@+id/ll_select_all"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:orientation="horizontal"
                android:paddingRight="10dp">

                <ImageView
                    android:id="@+id/iv_select_all"
                    android:layout_width="20dp"
                    android:layout_height="20dp"
                    android:layout_gravity="center_vertical"
                    android:layout_marginLeft="10dp"
                    android:background="@drawable/gouwuche_unselect_bg" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_marginLeft="6dp"
                    android:text="Future generations"
                    android:textColor="# 666666"
                    android:textSize="12dp" />
            </LinearLayout>

            <Button
                android:id="@+id/btn_order"
                android:layout_width="125dp"
                android:layout_height="40dp"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:layout_marginRight="15dp"
                android:background="@drawable/jiarugouwuche_bg"
                android:text="Settlement"
                android:textColor="#ffffff"
                android:textSize="16dp"
                android:visibility="visible" />

            <Button
                android:id="@+id/btn_delete"
                android:layout_width="125dp"
                android:layout_height="40dp"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:layout_marginRight="15dp"
                android:background="@drawable/jiarugouwuche_bg"
                android:text="Delete"
                android:textColor="#ffffff"
                android:textSize="16dp"
                android:visibility="gone" />

            <RelativeLayout
                android:id="@+id/rl_total_price"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_toLeftOf="@id/btn_order"
                android:layout_toRightOf="@id/ll_select_all">

                <TextView
                    android:id="@+id/tv_total_price"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentRight="true"
                    android:layout_centerVertical="true"
                    android:layout_marginLeft="2dp"
                    android:layout_marginRight="10dp"
                    android:maxLength="12"
                    android:singleLine="true"
                    android:text="¥0.00"
                    android:textColor="#d8b691"
                    android:textSize="15dp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerVertical="true"
                    android:layout_toLeftOf="@id/tv_total_price"
                    android:text="Total amount:"
                    android:textColor="# 555555"
                    android:textSize="13dp" />
            </RelativeLayout>

            <View
                android:layout_width="match_parent"
                android:layout_height="0.5 dp"
                android:background="#cccccc" />
        </RelativeLayout>
    </LinearLayout>

    <RelativeLayout
        android:id="@+id/rl_no_contant"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:visibility="gone">

        <ImageView
            android:id="@+id/iv_no_contant"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_centerHorizontal="true"
            android:scaleType="centerCrop"
            android:src="@drawable/kong_gouwuche" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:layout_below="@+id/iv_no_contant"
            android:layout_marginTop="20dp"
            android:gravity="center"
            android:text="Shopping cart was empty."
            android:textColor="# 808080"
            android:textSize="16dp" />
    </RelativeLayout>

</RelativeLayout>
Copy the code

2. Shopping cart implementation logic main interface (mainactivity.class)

package com.showly.yglin.shoppingcar; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.KeyEvent; import android.view.View; import android.widget.Button; import android.widget.ExpandableListView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.google.gson.Gson; import com.showly.yglin.shoppingcar.adapter.ShoppingCarAdapter; import com.showly.yglin.shoppingcar.bean.ShoppingCarDataBean; import com.showly.yglin.shoppingcar.customview.RoundCornerDialog; import com.showly.yglin.shoppingcar.util.ToastUtil; import java.util.ArrayList; import java.util.List; import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; /** * Main functions of shopping cart: * 1. * 2. * 3. Delete; * 4. Quantity of goods plus or minus; */ public class MainActivity extends AppCompatActivity { @InjectView(R.id.tv_titlebar_center) TextView tvTitlebarCenter;  @InjectView(R.id.tv_titlebar_right) TextView tvTitlebarRight; @InjectView(R.id.elv_shopping_car) ExpandableListView elvShoppingCar; @InjectView(R.id.iv_select_all) ImageView ivSelectAll; @InjectView(R.id.ll_select_all) LinearLayout llSelectAll; @InjectView(R.id.btn_order) Button btnOrder; @InjectView(R.id.btn_delete) Button btnDelete; @InjectView(R.id.tv_total_price) TextView tvTotalPrice; @InjectView(R.id.rl_total_price) RelativeLayout rlTotalPrice; @InjectView(R.id.rl) RelativeLayout rl; @InjectView(R.id.iv_no_contant) ImageView ivNoContant; @InjectView(R.id.rl_no_contant) RelativeLayout rlNoContant; @InjectView(R.id.tv_titlebar_left) ImageView tvTitlebarLeft; Private String shoppingCarData ="{\n" +
            " \"code\": 200,\n" +
            " \"datas\": [\n" +
            " {\n" +
            " \"goods\": [\n" +
            " {\n" +
            " \"goods_id\": \"111111\",\n" +
            " \"goods_image\": \"http://pic.58pic.com/58pic/15/62/69/34K58PICbmZ_1024.jpg\",\n" +
            "\"goods_name\": \" Romance of The Three Kingdoms \",\n" +
            " \"goods_num\": \"2\",\n" +
            Goods_price \ '\' \ ", \ "15.00" \ n" +
            " }\n" +
            " ],\n" +
            " \"store_id\": \"1\",\n" +
            "\ "store_name\": \" Bookstore grocery store \"\n" +
            " },\n" +
            " {\n" +
            " \"goods\": [\n" +
            " {\n" +
            " \"goods_id\": \"222221\",\n" +
            "\" goods_image \ ": \" http://file06.16sucai.com/2016/0511/9711205e4c003182edeed83355e6f1c7.jpg\, "\ n" +
            \"goods_name\": \" Journey to the West \",\n" +
            " \"goods_num\": \"2\",\n" +
            Goods_price \ '\' \ ", \ "12.00" \ n" +
            " },\n" +
            " {\n" +
            " \"goods_id\": \"222222\",\n" +
            " \"goods_image\": \"http://img01.taopic.com/150424/240473-1504240U13615.jpg\",\n" +
            "\"goods_name\ : \" Canonized list \",\n" +
            " \"goods_num\": \"1\",\n" +
            Goods_price \ '\' \ ", \ "28.00" \ n" +
            " }\n" +
            " ],\n" +
            " \"store_id\": \"2\",\n" +
            "\ "store_name\": \" Amazon Bookstore \"\n" +
            " },\n" +
            " {\n" +
            " \"goods\": [\n" +
            " {\n" +
            " \"goods_id\": \"333331\",\n" +
            " \"goods_image\": \"http://pic22.nipic.com/20120718/8002769_100147127333_2.jpg\",\n" +
            "\"goods_name\ : \" Water margin \",\n" +
            " \"goods_num\": \"3\",\n" +
            Goods_price \ '\' \ ", \ "18.00" \ n" +
            " },\n" +
            " {\n" +
            " \"goods_id\": \"333332\",\n" +
            " \"goods_image\": \"http://pic.58pic.com/58pic/14/71/50/40e58PICy54_1024.jpg\",\n" +
            "\"goods_name\ : \" Canonization \",\n" +
            " \"goods_num\": \"3\",\n" +
            Goods_price \ '\' \ ", \ "32.00" \ n" +
            " },\n" +
            " {\n" +
            " \"goods_id\": \"333333\",\n" +
            " \"goods_image\": \"http://img01.taopic.com/150518/318750-15051PS40671.jpg\",\n" +
            "\"goods_name\": \" Xuanyuan Sword \",\n" +
            " \"goods_num\": \"3\",\n" +
            Goods_price \ '\' \ ", \ "3.80" \ n" +
            " }\n" +
            " ],\n" +
            " \"store_id\": \"3\",\n" +
            "\ "store_name\": \" Sanwei Bookstore \"\n" +
            " }\n" +
            " ]\n" +
            "}";
    private List<ShoppingCarDataBean.DatasBean> datas;
    private Context context;
    private ShoppingCarAdapter shoppingCarAdapter;

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

        initExpandableListView();
        initData();
    }

    @OnClick({R.id.tv_titlebar_left, R.id.tv_titlebar_right})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            caseR.i.d.tv_titlebar_left :// Refresh data initData();break;
            caseR.i.d.tv_titlebar_right :// Edit String edit = tvTitleBarright.gettext ().toString().trim();if (edit.equals("Edit")) {
                    tvTitlebarRight.setText("Complete");
                    rlTotalPrice.setVisibility(View.GONE);
                    btnOrder.setVisibility(View.GONE);
                    btnDelete.setVisibility(View.VISIBLE);
                } else {
                    tvTitlebarRight.setText("Edit");
                    rlTotalPrice.setVisibility(View.VISIBLE);
                    btnOrder.setVisibility(View.VISIBLE);
                    btnDelete.setVisibility(View.GONE);
                }
                break;
            default:
                break; } /** * Initializes data */ private voidinitData() {// Use Gson to parse shopping cart data, //ShoppingCarDataBean for bean class, Gson to parse data according to bean class format /** * in actual development, */ Gson Gson = new Gson(); ShoppingCarDataBean shoppingCarDataBean = gson.fromJson(shoppingCarData, ShoppingCarDataBean.class); datas = shoppingCarDataBean.getDatas(); initExpandableListViewData(datas); } /** * create a data adapter adapter and initialize it */ private voidinitExpandableListView() { shoppingCarAdapter = new ShoppingCarAdapter(context, llSelectAll, ivSelectAll, btnOrder, btnDelete, rlTotalPrice, tvTotalPrice); elvShoppingCar.setAdapter(shoppingCarAdapter); / / delete the callback shoppingCarAdapter. SetOnDeleteListener (new shoppingCarAdapter.OnDeleteListener() {
            @Override
            public void onDelete() { initDelete(); / * * * in the actual development, in the request to delete interface, after the success of the delete, * by initExpandableListViewData refresh shopping cart data () method. * check whether the shop isSelect_shop by checking the isSelect_shop property of the DatasBean; * isSelect property of GoodsBean to determine whether the item is selected, * (trueFor the selected,falseIs not selected) */}}); / / modify quantity of callback shoppingCarAdapter setOnChangeCountListener (new shoppingCarAdapter.OnChangeCountListener() {@override public void onChangeCount(String goods_id) {/** * * by initExpandableListViewData () method to refresh the shopping cart data. * /}}); } /** * Initialize ExpandableListView data * and when the data is refreshed, Page to keep the current position * * @ param datas of shopping cart data * / private void initExpandableListViewData (List < ShoppingCarDataBean. DatasBean > datas) {if(datas ! = null && datas. The size () > 0) {/ / refresh data, keep the current position shoppingCarAdapter. SetData (datas); // Expand all groupsfor(int i = 0; i < shoppingCarAdapter.getGroupCount(); i++) { elvShoppingCar.expandGroup(i); } / / make group click no effect elvShoppingCar setOnGroupClickListener (new ExpandableListView.OnGroupClickListener() {

                @Override
                public boolean onGroupClick(ExpandableListView parent, View v,
                                            int groupPosition, long id) {
                    return true; }}); tvTitlebarRight.setVisibility(View.VISIBLE); tvTitlebarRight.setText("Edit");
            rlNoContant.setVisibility(View.GONE);
            elvShoppingCar.setVisibility(View.VISIBLE);
            rl.setVisibility(View.VISIBLE);
            rlTotalPrice.setVisibility(View.VISIBLE);
            btnOrder.setVisibility(View.VISIBLE);
            btnDelete.setVisibility(View.GONE);
        } else{ tvTitlebarRight.setVisibility(View.GONE); rlNoContant.setVisibility(View.VISIBLE); elvShoppingCar.setVisibility(View.GONE); rl.setVisibility(View.GONE); }} /** * check whether the deleted dialog is displayed by the isSelect_shop property of the DatasBean; * isSelect property of GoodsBean to determine whether the item is selected, */ private voidinitDelete() {// Check if any shops or goods are selected //trueIf yes, refresh the data. Otherwise, it is not needed; boolean hasSelect =false; / / create a temporary List, used to store didn't selected shopping cart data List < ShoppingCarDataBean. DatasBean > datasTemp = new ArrayList < > ();for (int i = 0; i < datas.size(); i++) {
            List<ShoppingCarDataBean.DatasBean.GoodsBean> goods = datas.get(i).getGoods();
            boolean isSelect_shop = datas.get(i).getIsSelect_shop();

            if (isSelect_shop) {
                hasSelect = true; // Jump out of this loop and continue with the next loop.continue;
            } else {
                datasTemp.add(datas.get(i));
                datasTemp.get(datasTemp.size() - 1).setGoods(new ArrayList<ShoppingCarDataBean.DatasBean.GoodsBean>());
            }

            for (int y = 0; y < goods.size(); y++) {
                ShoppingCarDataBean.DatasBean.GoodsBean goodsBean = goods.get(y);
                boolean isSelect = goodsBean.getIsSelect();

                if (isSelect) {
                    hasSelect = true;
                } else{ datasTemp.get(datasTemp.size() - 1).getGoods().add(goodsBean); }}}if (hasSelect) {
            showDeleteDialog(datasTemp);
        } else {
            ToastUtil.makeText(context, "Please select the item to delete"); }} /** * display the deleted dialog (you can customize the popover, Don't delete) * * @ param datasTemp * / private void showDeleteDialog (final List < ShoppingCarDataBean. DatasBean > datasTemp) { View view = View.inflate(context, R.layout.dialog_two_btn, null); final RoundCornerDialog roundCornerDialog = new RoundCornerDialog(context, 0, 0, view, R.style.RoundCornerDialog); roundCornerDialog.show(); roundCornerDialog.setCanceledOnTouchOutside(false); / / Settings Dialog click screen don't disappear roundCornerDialog. SetOnKeyListener (keylistener); TextView tv_message = view.findViewById(R.id.tv_message); TextView tv_logout_confirm = view.findViewById(R.id.tv_logout_confirm); TextView tv_logout_cancel = view.findViewById(R.id.tv_logout_cancel); tv_message.setText("Are you sure you want to delete the item?"); / / sure tv_logout_confirm. SetOnClickListener (new View.OnClickListener() { @Override public void onClick(View v) { roundCornerDialog.dismiss(); datas = datasTemp; initExpandableListViewData(datas); }}); / / cancel tv_logout_cancel. SetOnClickListener (new View.OnClickListener() { @Override public void onClick(View v) { roundCornerDialog.dismiss(); }}); } DialogInterface.OnKeyListener keylistener = new DialogInterface.OnKeyListener() {
        public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
                return true;
            } else {
                return false; }}}; }Copy the code

3. Use ExpandableListView, BaseExpandableListAdapter inheritance

package com.showly.yglin.shoppingcar.adapter; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.bumptech.glide.Glide; import com.showly.yglin.shoppingcar.R; import com.showly.yglin.shoppingcar.bean.ShoppingCarDataBean; import com.showly.yglin.shoppingcar.util.ToastUtil; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; import butterknife.ButterKnife; import butterknife.InjectView; /** * The adapter for the shopping cart * So the inheritance BaseExpandableListAdapter * / public class ShoppingCarAdapter extends BaseExpandableListAdapter {private final Context context; private final LinearLayout llSelectAll; private final ImageView ivSelectAll; private final Button btnOrder; private final Button btnDelete; private final RelativeLayout rlTotalPrice; private final TextView tvTotalPrice; private List<ShoppingCarDataBean.DatasBean> data; private boolean isSelectAll =false; private double total_price; public ShoppingCarAdapter(Context context, LinearLayout llSelectAll, ImageView ivSelectAll, Button btnOrder, Button btnDelete, RelativeLayout rlTotalPrice, TextView tvTotalPrice) { this.context = context; this.llSelectAll = llSelectAll; this.ivSelectAll = ivSelectAll; this.btnOrder = btnOrder; this.btnDelete = btnDelete; this.rlTotalPrice = rlTotalPrice; this.tvTotalPrice = tvTotalPrice; } /** * Custom set data method; * Refresh data with notifyDataSetChanged() to keep the current position * * @param data Data to refresh */ public voidsetData(List<ShoppingCarDataBean.DatasBean> data) {
        this.data = data;
        notifyDataSetChanged();
    }

    @Override
    public int getGroupCount() {
        if(data ! = null && data.size() > 0) {return data.size();
        } else {
            return 0;
        }
    }

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

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

    @Override
    public View getGroupView(final int groupPosition, final boolean isExpanded, View convertView, ViewGroup parent) {
        GroupViewHolder groupViewHolder;
        if (convertView == null) {
            convertView = View.inflate(context, R.layout.item_shopping_car_group, null);

            groupViewHolder = new GroupViewHolder(convertView);
            convertView.setTag(groupViewHolder);
        } else{ groupViewHolder = (GroupViewHolder) convertView.getTag(); } final ShoppingCarDataBean.DatasBean datasBean = data.get(groupPosition); // Store ID String store_id = datasbean.getstore_id (); // Store name String store_name = datasbean.getstore_name ();if(store_name ! = null) { groupViewHolder.tvStoreName.setText(store_name); }else {
            groupViewHolder.tvStoreName.setText(""); } // When all the goods in the shop are selected, the shop should also be selectedfor (int i = 0; i < datasBean.getGoods().size(); i++) {
            ShoppingCarDataBean.DatasBean.GoodsBean goodsBean = datasBean.getGoods().get(i);
            boolean isSelect = goodsBean.getIsSelect();
            if (isSelect) {
                datasBean.setIsSelect_shop(true);
            } else {
                datasBean.setIsSelect_shop(false);
                break; }} // becausesetFinal Boolean isSelect_shop = datasbean.getisselect_shop ();if (isSelect_shop) {
            groupViewHolder.ivSelect.setImageResource(R.drawable.xuanze_xuanzhong);
        } else{ groupViewHolder.ivSelect.setImageResource(R.drawable.unselect); } / / shop selection box click event groupViewHolder ll. SetOnClickListener (new View.OnClickListener() { @Override public void onClick(View v) { datasBean.setIsSelect_shop(! isSelect_shop); List<ShoppingCarDataBean.DatasBean.GoodsBean> goods = datasBean.getGoods();for(int i = 0; i < goods.size(); i++) { ShoppingCarDataBean.DatasBean.GoodsBean goodsBean = goods.get(i); goodsBean.setIsSelect(! isSelect_shop); } notifyDataSetChanged(); }}); // Select w when all boxes are checked:for (int i = 0; i < data.size(); i++) {
            List<ShoppingCarDataBean.DatasBean.GoodsBean> goods = data.get(i).getGoods();
            for (int y = 0; y < goods.size(); y++) {
                ShoppingCarDataBean.DatasBean.GoodsBean goodsBean = goods.get(y);
                boolean isSelect = goodsBean.getIsSelect();
                if (isSelect) {
                    isSelectAll = true;
                } else {
                    isSelectAll = false;
                    breakw; // According to the tag, out of the nested loop}}}if (isSelectAll) {
            ivSelectAll.setBackgroundResource(R.drawable.xuanze_xuanzhong);
        } else{ ivSelectAll.setBackgroundResource(R.drawable.unselect); } / / selection click event llSelectAll. SetOnClickListener (new View.OnClickListener() { @Override public void onClick(View v) { isSelectAll = ! isSelectAll;if (isSelectAll) {
                    for (int i = 0; i < data.size(); i++) {
                        List<ShoppingCarDataBean.DatasBean.GoodsBean> goods = data.get(i).getGoods();
                        for (int y = 0; y < goods.size(); y++) {
                            ShoppingCarDataBean.DatasBean.GoodsBean goodsBean = goods.get(y);
                            goodsBean.setIsSelect(true); }}}else {
                    for (int i = 0; i < data.size(); i++) {
                        List<ShoppingCarDataBean.DatasBean.GoodsBean> goods = data.get(i).getGoods();
                        for (int y = 0; y < goods.size(); y++) {
                            ShoppingCarDataBean.DatasBean.GoodsBean goodsBean = goods.get(y);
                            goodsBean.setIsSelect(false); } } } notifyDataSetChanged(); }}); // Total_price = 0.0; tvTotalPrice.setText("Selections of 0.00");
        for (int i = 0; i < data.size(); i++) {
            List<ShoppingCarDataBean.DatasBean.GoodsBean> goods = data.get(i).getGoods();
            for (int y = 0; y < goods.size(); y++) {
                ShoppingCarDataBean.DatasBean.GoodsBean goodsBean = goods.get(y);
                boolean isSelect = goodsBean.getIsSelect();
                if(isSelect) { String num = goodsBean.getGoods_num(); String price = goodsBean.getGoods_price(); double v = Double.parseDouble(num); double v1 = Double.parseDouble(price); total_price = total_price + v * v1; E DecimalFormat DecimalFormat = new DecimalFormat"0.00");
                    tvTotalPrice.setText("Selections"+ decimalFormat.format(total_price)); }}} / / to settle the click event of btnOrder. SetOnClickListener (new View.OnClickListener@override public void onClick(View v) {// Create a temporary List, Used to store the selected items List < ShoppingCarDataBean. DatasBean. GoodsBean > temp = new ArrayList < > ();for (int i = 0; i < data.size(); i++) {
                    List<ShoppingCarDataBean.DatasBean.GoodsBean> goods = data.get(i).getGoods();
                    for (int y = 0; y < goods.size(); y++) {
                        ShoppingCarDataBean.DatasBean.GoodsBean goodsBean = goods.get(y);
                        boolean isSelect = goodsBean.getIsSelect();
                        if(isSelect) { temp.add(goodsBean); }}}if(temp ! = null && temp.size() > 0) {// If there is a selected item /** * in actual development, if there is a selected item, * jump to the confirm order page, complete the subsequent order process. */ ToastUtil.makeText(context,"Jump to the order confirmation page and complete the subsequent order process");
                } else {
                    ToastUtil.makeText(context, "Please select the item to purchase."); }}}); / / remove the click event of btnDelete. SetOnClickListener (new View.OnClickListener() {@override public void onClick(View v) {/** *if(mDeleteListener ! = null) { mDeleteListener.onDelete(); }}});return convertView;
    }

    static class GroupViewHolder {
        @InjectView(R.id.iv_select)
        ImageView ivSelect;
        @InjectView(R.id.tv_store_name)
        TextView tvStoreName;
        @InjectView(R.id.ll)
        LinearLayout ll;

        GroupViewHolder(View view) {
            ButterKnife.inject(this, view);
        }
    }

    //------------------------------------------------------------------------------------------------
    @Override
    public int getChildrenCount(int groupPosition) {
        if(data.get(groupPosition).getGoods() ! = null && data.get(groupPosition).getGoods().size() > 0) {return data.get(groupPosition).getGoods().size();
        } else {
            return 0;
        }
    }

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

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

    @Override
    public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ChildViewHolder childViewHolder;
        if (convertView == null) {
            convertView = View.inflate(context, R.layout.item_shopping_car_child, null);

            childViewHolder = new ChildViewHolder(convertView);
            convertView.setTag(childViewHolder);
        } else{ childViewHolder = (ChildViewHolder) convertView.getTag(); } final ShoppingCarDataBean.DatasBean datasBean = data.get(groupPosition); // Store ID String store_id = datasbean.getstore_id (); // Store name String store_name = datasbean.getstore_name (); Final Boolean isSelect_shop = datasbean.getisselect_shop (); final ShoppingCarDataBean.DatasBean.GoodsBean goodsBean = datasBean.getGoods().get(childPosition); String goods_image = goodsbean.getGoods_image (); // Final String goods_id = goodsbean.getGoods_id (); String goods_name = goodsbean.getGoods_name (); String goods_price = goodsbean.getGoods_price (); String goods_num = goodsbean.getGoods_num (); Final Boolean isSelect = goodsbean.getisSelect (); Glide.with(context) .load(R.drawable.img) .into(childViewHolder.ivPhoto);if(goods_name ! = null) { childViewHolder.tvName.setText(goods_name); }else {
            childViewHolder.tvName.setText("");
        }
        if(goods_price ! = null) { childViewHolder.tvPriceValue.setText(goods_price); }else {
            childViewHolder.tvPriceValue.setText("");
        }
        if(goods_num ! = null) { childViewHolder.tvEditBuyNumber.setText(goods_num); }else {
            childViewHolder.tvEditBuyNumber.setText(""); } // Whether the item is selectedif (isSelect) {
            childViewHolder.ivSelect.setImageResource(R.drawable.xuanze_xuanzhong);
        } else{ childViewHolder.ivSelect.setImageResource(R.drawable.unselect); } / / commodity selection box click event childViewHolder ivSelect. SetOnClickListener (new View.OnClickListener() { @Override public void onClick(View v) { goodsBean.setIsSelect(! isSelect);if(! isSelect ==false) {
                    datasBean.setIsSelect_shop(false); } notifyDataSetChanged(); }}); / / plus the click event of childViewHolder. IvEditAdd. SetOnClickListener (new View.OnClickListener@override public void onClick(View v) {String num = goodsbean.getGoods_num (); Integerinteger = Integer.valueOf(num);
                integer+ +; goodsBean.setGoods_num(integer + ""); notifyDataSetChanged(); /** * In the actual development, the number is added or subtracted through the callback request background interface */if(mChangeCountListener ! = null) { mChangeCountListener.onChangeCount(goods_id); }}}); / / minus the click event of childViewHolder. IvEditSubtract. SetOnClickListener (new View.OnClickListener@override public void onClick(View v) {String num = goodsbean.getGoods_num (); Integerinteger = Integer.valueOf(num);
                if (integer > 1) {
                    integer-; goodsBean.setGoods_num(integer + ""); /** * In the actual development, the number is added or subtracted through the callback request background interface */if (mChangeCountListener != null) {
                        mChangeCountListener.onChangeCount(goods_id);
                    }
                } else {
                    ToastUtil.makeText(context, "There can be no reduction in merchandise."); } notifyDataSetChanged(); }});if (childPosition == data.get(groupPosition).getGoods().size() - 1) {
            childViewHolder.view.setVisibility(View.GONE);
            childViewHolder.viewLast.setVisibility(View.VISIBLE);
        } else {
            childViewHolder.view.setVisibility(View.VISIBLE);
            childViewHolder.viewLast.setVisibility(View.GONE);
        }

        return convertView;
    }

    static class ChildViewHolder {
        @InjectView(R.id.iv_select)
        ImageView ivSelect;
        @InjectView(R.id.iv_photo)
        ImageView ivPhoto;
        @InjectView(R.id.tv_name)
        TextView tvName;
        @InjectView(R.id.tv_price_key)
        TextView tvPriceKey;
        @InjectView(R.id.tv_price_value)
        TextView tvPriceValue;
        @InjectView(R.id.iv_edit_subtract)
        ImageView ivEditSubtract;
        @InjectView(R.id.tv_edit_buy_number)
        TextView tvEditBuyNumber;
        @InjectView(R.id.iv_edit_add)
        ImageView ivEditAdd;
        @InjectView(R.id.view)
        View view;
        @InjectView(R.id.view_last)
        View viewLast;

        ChildViewHolder(View view) {
            ButterKnife.inject(this, view);
        }
    }

    //-----------------------------------------------------------------------------------------------

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

    @Override
    public boolean hasStableIds() {
        return false; } public interface OnDeleteListener {void onDelete(); } public voidsetOnDeleteListener(OnDeleteListener listener) { mDeleteListener = listener; } private OnDeleteListener mDeleteListener; Public interface OnChangeCountListener {void onChangeCount(String goods_id); public interface OnChangeCountListener {void onChangeCount(String goods_id); } public voidsetOnChangeCountListener(OnChangeCountListener listener) {
        mChangeCountListener = listener;
    }

    private OnChangeCountListener mChangeCountListener;
}

Copy the code

4. The shopping cart data bean class (ShoppingCarDataBean. Class)

package com.showly.yglin.shoppingcar.bean; import java.util.List; /** * public class ShoppingCarDataBean {private int code; private List<DatasBean> datas; public intgetCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public List<DatasBean> getDatas() {
        return datas;
    }

    public void setDatas(List<DatasBean> datas) { this.datas = datas; } public static class DatasBean { private String store_id; private String store_name; private boolean isSelect_shop; Private List<GoodsBean> goods; public booleangetIsSelect_shop() {
            return isSelect_shop;
        }

        public void setIsSelect_shop(boolean select_shop) {
            isSelect_shop = select_shop;
        }

        public String getStore_id() {
            return store_id;
        }

        public void setStore_id(String store_id) {
            this.store_id = store_id;
        }

        public String getStore_name() {
            return store_name;
        }

        public void setStore_name(String store_name) {
            this.store_name = store_name;
        }

        public List<GoodsBean> getGoods() {
            return goods;
        }

        public void setGoods(List<GoodsBean> goods) { this.goods = goods; } public static class GoodsBean { private String goods_id; private String goods_image; private String goods_name; private String goods_num; private String goods_price; private boolean isSelect; Public Boolean whether the item is selected in the shopping cartgetIsSelect() {
                return isSelect;
            }

            public void setIsSelect(boolean isSelect) {
                this.isSelect = isSelect;
            }

            public String getGoods_id() {
                return goods_id;
            }

            public void setGoods_id(String goods_id) {
                this.goods_id = goods_id;
            }

            public String getGoods_image() {
                return goods_image;
            }

            public void setGoods_image(String goods_image) {
                this.goods_image = goods_image;
            }

            public String getGoods_name() {
                return goods_name;
            }

            public void setGoods_name(String goods_name) {
                this.goods_name = goods_name;
            }

            public String getGoods_num() {
                return goods_num;
            }

            public void setGoods_num(String goods_num) {
                this.goods_num = goods_num;
            }

            public String getGoods_price() {
                return goods_price;
            }

            public void setGoods_price(String goods_price) { this.goods_price = goods_price; }}}}Copy the code

5. Realize the layout of different stores

Renderings (in red) :

<? 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="match_parent"
    android:background="#ffffff"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/ll"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/iv_select"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="10dp"
            android:background="@drawable/unselect" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="10dp"
            android:background="@drawable/biaoqianlan_kefu" />

        <TextView
            android:id="@+id/tv_store_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginLeft="10dp"
            android:text="Shop Name"
            android:textColor="# 333333"
            android:textSize="14dp"
            android:maxLines="1"
            android:ellipsize="end"/>
    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="0.5 dp"
        android:layout_marginLeft="10dp"
        android:background="#cccccc" />
</LinearLayout>
Copy the code

6. Layout file renderings of items in shopping cart:

<? xml version="1.0" encoding="utf-8"? > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ffffff"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="#ffffff">

        <ImageView
            android:id="@+id/iv_select"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center_vertical"
            android:padding="10dp"
            android:src="@drawable/unselect" />

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

            <ImageView
                android:id="@+id/iv_photo"
                android:layout_width="90dp"
                android:layout_height="90dp"
                android:layout_centerVertical="true"
                android:background="#ededed"
                android:scaleType="centerCrop" />

            <TextView
                android:id="@+id/tv_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_marginTop="10dp"
                android:layout_toRightOf="@id/iv_photo"
                android:ellipsize="end"
                android:maxLines="2"
                android:text="Time and space room ah link Frankfurt pride pull the plane Ali come in scatter robber card lose weight see pull kill robber garbage fee garbage fee."
                android:textColor="# 333333"
                android:textSize="14dp" />

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="35dp"
                android:layout_alignParentBottom="true"
                android:layout_marginLeft="10dp"
                android:layout_toRightOf="@id/iv_photo">

                <TextView
                    android:id="@+id/tv_price_key"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerVertical="true"
                    android:text="Selections"
                    android:textColor="#ee1d23"
                    android:textSize="12dp" />

                <TextView
                    android:id="@+id/tv_price_value"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerVertical="true"
                    android:layout_marginLeft="2dp"
                    android:layout_toRightOf="@id/tv_price_key"
                    android:text="499"
                    android:textColor="#ee1d23"
                    android:textSize="14dp" />

                <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_alignParentRight="true"
                    android:layout_centerVertical="true"
                    android:gravity="center"
                    android:orientation="horizontal">

                    <ImageView
                        android:id="@+id/iv_edit_subtract"
                        android:layout_width="wrap_content"
                        android:layout_height="match_parent"
                        android:paddingLeft="15dp"
                        android:paddingRight="15dp"
                        android:src="@drawable/iv_edit_subtract" />

                    <TextView
                        android:id="@+id/tv_edit_buy_number"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:gravity="center"
                        android:minEms="1"
                        android:text="1"
                        android:textColor="# 666666"
                        android:textSize="12dp" />

                    <ImageView
                        android:id="@+id/iv_edit_add"
                        android:layout_width="wrap_content"
                        android:layout_height="match_parent"
                        android:paddingLeft="15dp"
                        android:paddingRight="15dp"
                        android:src="@drawable/iv_edit_add" />
                </LinearLayout>

                <View
                    android:id="@+id/view"
                    android:layout_width="match_parent"
                    android:layout_height="0.5 dp"
                    android:layout_alignParentBottom="true"
                    android:background="#cccccc" />
            </RelativeLayout>
        </RelativeLayout>
    </LinearLayout>

    <View
        android:id="@+id/view_last"
        android:layout_width="match_parent"
        android:layout_height="10dp"
        android:layout_alignParentBottom="true"
        android:background="#ededed"
        android:visibility="gone" />
</LinearLayout>
Copy the code

Since then, the shopping cart function has been basically realized

Demo: bottom public number reply “shopping cart function” can be obtained.

The following is our personal public account (LongXuanzhigu). Our articles will be synchronized to this account, which is convenient for exchanging and learning Android knowledge and sharing personal favorite articles: