Android 购物车选择商品加减和价格合计

本文详细介绍了一个简单的购物车功能实现过程,包括购物车界面布局、商品列表项的设计、购物车类和适配器类的编写等内容。通过代码示例展示了如何进行商品选择、数量增减及总价计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模板图:


1.购物车主界面

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <RelativeLayout
        android:id="@+id/topRea"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="#4A90E2">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="购物车" />
    </RelativeLayout>


    <LinearLayout
        android:id="@+id/bottemLin"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal">

        <RelativeLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1">

            <CheckBox
                android:id="@+id/allcheck"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="10dp"
                android:text="全选"
                android:textColor="#000000" />

            <TextView
                android:id="@+id/heji"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="20dp"
                android:layout_toRightOf="@+id/allcheck"
                android:text="合计"
                android:textColor="#000000" />

            <TextView
                android:id="@+id/hejivalue"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="10dp"
                android:layout_toRightOf="@+id/heji"
                android:textColor="#000000"
                android:textStyle="bold"
                android:text="0.0"/>

        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/jiesuanRea"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.8"
            android:background="#4A90E2">


            <TextView
                android:id="@+id/jiesuan"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:layout_centerVertical="true"
                android:layout_marginLeft="10dp"
                android:text="结算"
                android:textColor="#ffffff" />

            <TextView
                android:id="@+id/zuo"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_toRightOf="@+id/jiesuan"
                android:text="("
                android:textColor="#ffffff"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/jiesuanvalue"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_toRightOf="@+id/zuo"
                android:text="0"
                android:textColor="#ffffff"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/you"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_toRightOf="@+id/jiesuanvalue"
                android:text=")"
                android:textColor="#ffffff"
                android:textStyle="bold" />

        </RelativeLayout>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/center"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/bottemLin"
        android:layout_below="@+id/topRea"
        android:orientation="vertical">

        <ListView
            android:id="@+id/MyList"
            android:layout_width="match_parent"
            android:layout_height="match_parent"></ListView>

    </LinearLayout>

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_below="@+id/center"
        android:background="#9c9c9c" />
</RelativeLayout>

2.商品的Item界面

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

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

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

    <RelativeLayout
        android:layout_toRightOf="@+id/checkone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:background="@mipmap/ic_launcher"
            android:id="@+id/img"
            android:layout_margin="10dp"
            android:layout_width="80dp"
            android:layout_height="80dp"
            />
        <TextView
            android:id="@+id/good_name"
            android:layout_toRightOf="@+id/img"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:textColor="#000000"
            android:singleLine="true"
            android:textStyle="bold"
            android:textSize="16sp"
            />
        <TextView
            android:id="@+id/good_fname"
            android:layout_width="wrap_content"
            android:layout_marginTop="2dp"
            android:layout_toRightOf="@+id/img"
            android:layout_below="@+id/good_name"
            android:layout_height="wrap_content" />
        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_toRightOf="@+id/img"
            android:layout_marginTop="4dp"
            android:layout_below="@+id/good_fname"
            android:layout_height="wrap_content">
            <TextView
                android:id="@+id/good_money"
                android:layout_centerVertical="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
            <LinearLayout
                android:layout_centerVertical="true"
                android:layout_width="wrap_content"
                android:layout_marginRight="10dp"
                android:orientation="horizontal"
                android:layout_alignParentRight="true"
                android:layout_height="wrap_content">

                <Button
                    android:id="@+id/jian"
                    android:layout_width="30dp"
                    android:background="#f2f1f1"
                    android:text="-"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    />
                <TextView
                    android:id="@+id/nu"

                    android:layout_width="30dp"
                    android:layout_height="match_parent"
                    android:text="1"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:textColor="#000000"
                    />
                <Button
                    android:id="@+id/jia"
                    android:layout_weight="1"
                    android:layout_width="30dp"
                    android:background="#f2f1f1"
                    android:text="+"

                    android:layout_height="wrap_content"
                    />
            </LinearLayout>

        </RelativeLayout>

    </RelativeLayout>

</RelativeLayout>
</LinearLayout>

3.购物车类

public class MainActivity extends Activity implements CarAdapter.CheckInterface,CarAdapter.ModifyCountInterface{

    private ListView MyList;
    private CheckBox allcheck;
    private TextView hejivalue,jiesuanvalue;
    private List<CarInfo> list;

    public static LinearLayout bottemLin;
    private  CarAdapter adapter;

    private double totalPrice = 0.00;// 购买的商品总价
    private int totalCount = 0;// 购买的商品总数量

    private RelativeLayout jiesuanRea;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initList();
        c();
    }

    private void initList() {
        list = new ArrayList<>();
        for(int i =0;i<10;i++){
            CarInfo info = new CarInfo();
            info.setSpnum("1");
            info.setSpprice("36");
            info.setSptype("cjy");
            info.setSpname("创利丰");
            list.add(info);
        }
        adapter = new CarAdapter(this,list);
        MyList.setAdapter(adapter);
    }

    private void initView() {
        jiesuanRea = (RelativeLayout) findViewById(R.id.jiesuanRea);
        bottemLin = (LinearLayout)findViewById(R.id.bottemLin);
        MyList = (ListView) findViewById(R.id.MyList);
        allcheck = (CheckBox) findViewById(R.id.allcheck);
        hejivalue  = (TextView)findViewById(R.id.hejivalue);
        jiesuanvalue = (TextView)findViewById(R.id.jiesuanvalue);
        allcheck.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                doCheckAll();
            }
        });

        jiesuanRea.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            }
        });

    }
    private void c(){
        adapter.setCheckInterface(this);// 关键步骤1,设置复选框接口
        adapter.setModifyCountInterface(this);// 关键步骤2,设置数量增减接口
    }

    /** 全选与反选 */
    private void doCheckAll()
    {
        for (int i = 0; i < list.size(); i++)
        {
            list.get(i).setChoosed(allcheck.isChecked());
        }
        adapter.notifyDataSetChanged();
        calculate();
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        jiesuanvalue = null;
        hejivalue = null;
        allcheck = null;
    }


    private boolean isAllCheck()
    {

        for (CarInfo info : list)
        {
            if (!info.isChoosed())
                return false;

        }

        return true;
    }

    private void calculate() {
        totalCount = 0;
        totalPrice = 0.00;
        for (int j = 0; j < list.size(); j++) {
            CarInfo product = list.get(j);
            if (product.isChoosed()) {
                totalCount += Integer.parseInt(product.getSpnum());
                totalPrice += Double.parseDouble(product.getSpprice()) * Double.parseDouble(product.getSpnum());
            }
        }
        hejivalue.setText("¥" + totalPrice);
        jiesuanvalue.setText("" + totalCount);
    }

    @Override
    public void checkChild( int childPosition, boolean isChecked) {

        if (isAllCheck())
            allcheck.setChecked(true);
        else
            allcheck.setChecked(false);
        adapter.notifyDataSetChanged();
        calculate();
    }

    @Override
    public void doIncrease(int childPosition, View showCountView, boolean isChecked) {
        CarInfo info = (CarInfo) adapter.getItem(childPosition);
        int currentCount = Integer.parseInt(info.getSpnum());
        currentCount++;
        info.setSpnum(String.valueOf(currentCount));
        ((TextView) showCountView).setText(currentCount + "");

        adapter.notifyDataSetChanged();
        calculate();
    }

    @Override
    public void doDecrease( int childPosition, View showCountView, boolean isChecked) {
        CarInfo info = (CarInfo) adapter.getItem(childPosition);
        int currentCount = Integer.parseInt(info.getSpnum());
        if (currentCount == 1)
            return;
        currentCount--;

        info.setSpnum(String.valueOf(currentCount));
        ((TextView) showCountView).setText(currentCount + "");

        adapter.notifyDataSetChanged();
        calculate();
    }
}

4.购物车适配器

public class CarAdapter extends BaseAdapter {


    private Context context;
    private List<CarInfo> list;

    private CheckInterface checkInterface;
    private ModifyCountInterface modifyCountInterface;

//  private   ImageLoader imageLoader;
//private RequestQueue mQueue;
//    private com.android.volley.toolbox.ImageLoader mImageLoader;



    //商品id
    private int carid;
    //商品数量
    private String num;


    public CarAdapter(Context context, List<CarInfo> list){
        this.context = context;
        this.list = list;
//        imageLoader = ImageLoader.getInstance();
//        mQueue = Volley.newRequestQueue(context);
//        mImageLoader = new com.android.volley.toolbox.ImageLoader(mQueue, new BitmapCache());//
    }



    public void setCheckInterface(CheckInterface checkInterface) {
        this.checkInterface = checkInterface;
    }

    public void setModifyCountInterface(ModifyCountInterface modifyCountInterface) {
        this.modifyCountInterface = modifyCountInterface;
    }


    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        if(convertView == null){
            convertView = View.inflate(context, R.layout.item, null);
            holder = new ViewHolder();
            holder.good_name = (TextView) convertView.findViewById(R.id.good_name);
            holder.good_fname = (TextView) convertView.findViewById(R.id.good_fname);
            holder.img = (ImageView) convertView.findViewById(R.id.img);
            holder.good_money = (TextView) convertView.findViewById(R.id.good_money);
            holder.nu = (TextView) convertView.findViewById(R.id.nu);
            holder.checkone = (CheckBox) convertView.findViewById(R.id.checkone);
            holder.jia = (Button) convertView.findViewById(R.id.jia);
            holder.jian = (Button) convertView.findViewById(R.id.jian);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }


        final CarInfo info = list.get(position);
        if(info != null){
            holder.checkone.setChecked(info.isChoosed());

            holder.checkone.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    info.setChoosed(((CheckBox) v).isChecked());
                    holder.checkone.setChecked(((CheckBox) v).isChecked());
                    checkInterface.checkChild(position, ((CheckBox) v).isChecked());// 暴露子选接口
                }
            });


            holder.good_name.setText(list.get(position).getSpname());
            holder.good_fname.setText("型号: "+info.getSptype());
            holder.good_money.setText("¥ "+list.get(position).getSpprice());
            holder.nu.setText(list.get(position).getSpnum());

            holder.jia.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    modifyCountInterface.doIncrease(position, holder.nu, holder.checkone.isChecked());// 暴露增加接口
                }
            });


            holder.jian.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    modifyCountInterface.doDecrease(position, holder.nu, holder.checkone.isChecked());// 暴露删减接口
                }
            });
        }

        return convertView;
    }




    class ViewHolder{
        ImageView img;
        Button jia,jian;
        TextView good_name,good_fname,good_money,nu;
        CheckBox checkone;
    }



    /**
     * 复选框接口
     */
    public interface CheckInterface {
//        /**
//         * 组选框状态改变触发的事件
//         *
//         * @param groupPosition 组元素位置
//         * @param isChecked     组元素选中与否
//         */
//        public void checkGroup(int groupPosition, boolean isChecked);

        /**
         * 子选框状态改变时触发的事件
         *
         * @param childPosition 子元素位置
         * @param isChecked     子元素选中与否
         */
        public void checkChild(int childPosition, boolean isChecked);
    }

    /**
     * 改变数量的接口
     */
    public interface ModifyCountInterface {
        /**
         * 增加操作
         *
         * @param childPosition 子元素位置
         * @param showCountView 用于展示变化后数量的View
         * @param isChecked     子元素选中与否
         */
        public void doIncrease(int childPosition, View showCountView, boolean isChecked);

        /**
         * 删减操作
         *
         * @param childPosition 子元素位置
         * @param showCountView 用于展示变化后数量的View
         * @param isChecked     子元素选中与否
         */
        public void doDecrease(int childPosition, View showCountView, boolean isChecked);
    }
}
Demo下载地址:https://download.youkuaiyun.com/download/qq_39735504/10273699
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值