关于购物车全选反选结算问题

本文介绍了一种实现购物车全选、反选及结算功能的方法,包括使用ListView展示商品信息、通过CheckBox控制商品选中状态、实现商品全选与反选功能等。此外还介绍了如何通过数据库操作来保存和更新购物车中的商品信息。

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

这里提供一下实现购物车全选,反选,结算的思路


为了解决ListView滑动时,checkBox不会错乱,写一个集合,装载checkBox状态

 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.shopfragment, container, false);
        //初始化事件
        initView();
        //从数据库查询数据
        getData();

        //根据商品个数判断加载的布局
        if (dataList.size() == 0) {
            //数据库中没有东西,显示空的界面
            empty_linear.setVisibility(View.VISIBLE);
            shopcart_have.setVisibility(View.GONE);

        } else {
            empty_linear.setVisibility(View.GONE);
            shopcart_have.setVisibility(View.VISIBLE);
        }

        //加载数据,适配显示
        initData();

        //初始化事件
        initEvent();
        return view;
    }
    /**
     * 初始化界面
     */
    private void initView() {
        num = (TextView) view.findViewById(R.id.shopcart_num);
        editor = (TextView) view.findViewById(R.id.shopcart_edit);
        allCheck = (CheckBox) view.findViewById(R.id.allcheck_img);
        total_price = (TextView) view.findViewById(R.id.total_tv);
        total_btn = (Button) view.findViewById(R.id.total_btn);
        listView = (ListView) view.findViewById(R.id.shopcart_lv);
        empty_linear = (LinearLayout) view.findViewById(R.id.empty_linear);
        shopcart_have = (LinearLayout) view.findViewById(R.id.shopcart_have);
        btn_gyg = (Button) view.findViewById(R.id.btnshopping_gyg);

    }
    /**
     * 数据库查询数据,并初始化集合
     */
    private void getData() {
        ShopDao dao = new ShopDao(getContext());
        dataList = dao.select();

        for (int i = 0; i < dataList.size(); i++) {
            statelist.add(false);//所有多选框初始状态是false,不勾选
        }
    }
    /**
     * 加载数据,适配显示
     */
    private void initData() {
        //监听checkbox状态
        //点中时改成相反的值
        //结算,判断是否勾选,若勾选价格相加,否则,价格相减
        //勾选,价格是string类型的,所以价格和数量相乘前,先把价格转成double类型
        //保留两位小数
        //如果ck全部勾选,则全选选中
        //给控件设置值
        adapter = new BaseAdapter() {
            @Override
            public int getCount() {
                return dataList.size();
            }

            @Override
            public Object getItem(int i) {
                return dataList.get(i);
            }

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

            class ViewHolder {
                ImageView img;
                TextView title;
                TextView price;
                TextView num;
                CheckBox ck;
                RelativeLayout rl;
            }

            @Override
            public View getView(final int i, View view, ViewGroup viewGroup) {
                ViewHolder vh;
                if (view == null) {
                    vh = new ViewHolder();
                    view = View.inflate(getActivity(), R.layout.shopcart_lv_item, null);
                    vh.img = (ImageView) view.findViewById(R.id.shopcart_img);
                    vh.title = (TextView) view.findViewById(R.id.shopcart_title);
                    vh.price = (TextView) view.findViewById(R.id.shopcart_price);
                    vh.num = (TextView) view.findViewById(R.id.shopcart_num);
                    vh.rl = (RelativeLayout) view.findViewById(R.id.shopcart_item_rl);

                    if (editor.getText().toString().equals("编辑")) {
                        vh.rl.setVisibility(View.GONE);

                    } else if (editor.getText().toString().equals("完成")) {
                        vh.rl.setVisibility(View.VISIBLE);
                        vh.num.setVisibility(View.GONE);
                        statelist.set(i, false);
                    }

                    vh.ck = (CheckBox) view.findViewById(R.id.shopcart_checked);
                    view.setTag(vh);
                } else {
                    vh = (ViewHolder) view.getTag();
                }
                vh.ck.setChecked(statelist.get(i));
                //监听checkbox状态
                vh.ck.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        //点中时改成相反的值
                        statelist.set(i, !statelist.get(i));

                        //结算,判断是否勾选,若勾选价格相加,否则,价格相减
                        if (statelist.get(i)) {
                            //勾选,价格是string类型的,所以价格和数量相乘前,先把价格转成double类型
                            double price = Double.parseDouble(dataList.get(i).price);
                            money += price * dataList.get(i).num;

                        } else {
                            double price = Double.parseDouble(dataList.get(i).price);
                            money -= price * dataList.get(i).num;
                        }
                        total_price.setText("总价:¥" + df.format(money));//保留两位小数
                        //如果ck全部勾选,则全选选中
                        if (statelist.contains(false)) {
                            allCheck.setChecked(false);
                        } else {
                            allCheck.setChecked(true);
                        }
                        notifyDataSetChanged();
                    }
                });
                //给控件设置值
                ImageLoader imageLoader = ImageLoader.getInstance();
                imageLoader.displayImage(dataList.get(i).img, vh.img);
                vh.title.setText(dataList.get(i).title);
                vh.price.setText("¥" + dataList.get(i).price);
                vh.num.setText("数量:" + dataList.get(i).num);

                return view;
            }
        };
        //把适配器封装起来,因为如果布局改变,需要重新适配数据,只是通知适配器不行,
        // 只有改变数据时,通知适配器才有用,这里主要是方便后面编辑布局改变时的用到的
        listView.setAdapter(adapter);
    }

    /**
     * 初始化事件
     */
    private void initEvent() {
        //监听全选
        allCheck.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                boolean flag = allCheck.isChecked();
                money = 0;
                for (int i = 0; i < statelist.size(); i++) {
                    statelist.set(i, flag);
                    if (allCheck.isChecked()) {
                        //全选,结算
                        double price = Double.parseDouble(dataList.get(i).price);
                        money += price * dataList.get(i).num;
                    } else {
                        money = 0;
                    }
                }
                adapter.notifyDataSetChanged();
                total_price.setText("总价:¥" + df.format(money));
            }
        });

        //编辑
        editor.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (editor.getText().toString().equals("编辑")) {
                    editor.setText("完成");
                    total_price.setVisibility(View.GONE);
                    total_btn.setText("删除");
                    money = 0;
                    total_price.setText("总价:¥0.00");
                    allCheck.setChecked(false);

                } else if (editor.getText().toString().equals("完成")) {
                    editor.setText("编辑");
                    total_price.setVisibility(View.VISIBLE);
                    total_btn.setText("结算");
                }

                initData();
            }
        });
        total_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                totalPrice();
            }
        });
    }

    //结算
    private void totalPrice() {
        if (total_btn.getText().toString().equals("结算")) {
            if (!statelist.contains(true)) {
                Toast.makeText(getContext(), "您还没有选中任何商品哦!", Toast.LENGTH_SHORT).show();
            } else {
    <span style="white-space:pre">		</span>//结算跳转到支付宝,在这里先不做

            }
        } else if (total_btn.getText().toString().equals("删除")) {
            if (!statelist.contains(true)) {
                Toast.makeText(getContext(), "未选中任何商品删除", Toast.LENGTH_SHORT).show();
            } else {
                AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
                builder.setView(View.inflate(getContext(), R.layout.delete_pop, null));
                builder.setPositiveButton("删除", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int ii) {
                        ShopDao dao = new ShopDao(getContext());
                        //根据状态集合,判断哪个是要删除的
                        for (int i = 0; i < statelist.size(); i++) {
                            if (statelist.get(i)) {
                                String title = dataList.get(i).title;
                                dao.delete(title);//从数据库中删除
                            }
                        }
                        //清空集合
                        dataList.clear();
                        statelist.clear();
                        //重新添加
                        dataList.addAll(dao.select());
                        //状态集合也要改变长度和状态
                        for (int i = 0; i < dataList.size(); i++) {
                            statelist.add(false);
                        }
                        //通知适配器
                        adapter.notifyDataSetChanged();
                    }
                });

                builder.setNegativeButton("取消", null);
                AlertDialog dialog = builder.create();
                dialog.show();
            }
        }
    }

//数据库

public class MyOpenHelper extends SQLiteOpenHelper {

    public MyOpenHelper(Context context) {
        super(context, "yi.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //建表
        sqLiteDatabase.execSQL("create table shopcart(id integer primary key autoincrement,img varchar(20),title varchar(20),price varchar(20),num int(11))");
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        //数据库升级
    }
}
//dao

public class ShopDao {
    private final MyOpenHelper myOpenHelper;
    private final SQLiteDatabase datas;
    public ShopDao(Context context){
        myOpenHelper = new MyOpenHelper(context);
        datas = myOpenHelper.getWritableDatabase();
    }
    //添加
    public void addData(DetailBean.Data.Goods goods,String title,int i){
        ContentValues values=new ContentValues();
        values.put("img",goods.gallery.get(0).normal_url);
        values.put("title",title);
        values.put("price",goods.shop_price);
        values.put("num",i);
        datas.insert("shopcart",null,values);
    }
    //查询
    public List<ShopcartBean> select(){
        Cursor cursor = datas.query(false, "shopcart", null, null, null ,null, null, null, null);
        //创建集合
        List<ShopcartBean> list=new ArrayList<ShopcartBean>();
        while(cursor.moveToNext()){
            String img = cursor.getString(cursor.getColumnIndex("img"));
            String title = cursor.getString(cursor.getColumnIndex("title"));
            String price = cursor.getString(cursor.getColumnIndex("price"));
            int num = cursor.getInt(cursor.getColumnIndex("num"));
            ShopcartBean bean=new ShopcartBean(img,title,price,num);
            list.add(bean);
        }
        //关闭游标
        closeCourse(cursor);
        return list;

    }
    //删除
    public void delete(String title){
       datas.delete("shopcart","title=?",new String[]{title});
    }
    //关闭数据库
    public void closeData()
    {
        if(datas!=null&&datas.isOpen())
        {
            datas.close();
        }
    }
    //关闭游标
    public void closeCourse(Cursor cursor)
    {
        if(!cursor.isClosed())
        {
            cursor.close();
        }
    }

}


实现效果如下

//反选代码部分,主要提供思路

reverse.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				if (! checkAdapter.getSelect().contains(true)) {
					Toast.makeText(MainActivity.this, "qingxuanz", 0).show();
				}else {
					for (int i = 0; i < checkAdapter.getSelect().size(); i++) {
						if (checkAdapter.getSelect().get(i)) {
							checkAdapter.getSelect().set(i, false);
						}else {
							checkAdapter.getSelect().set(i, true);
						}
					}
					
					if (checkAdapter.getSelect().contains(false)) {
						allBox.setChecked(false);
					}
					
					checkAdapter.notifyDataSetChanged();
				}
			}
		});
		
	}




点击保存到购物车,数据存到数据库,购物车界面的数据展示是从数据库中查询出来展示的,所以删也要从数据库中删除,重新适配一下


以上只是提供了一些思路,具体到项目中还要随机应变,上述代码可以实现全选反选

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值