购物车页面

本文详细探讨了电子商务网站中购物车功能的实现原理,包括添加商品、更新数量、删除商品以及保存用户会话等关键操作。同时,介绍了如何使用cookie和session来管理用户的购物车状态,并讨论了其优缺点。此外,还提到了如何在前后端分离的架构下实现购物车的同步和持久化,以及在高并发场景下的解决方案。

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


//住xml

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"

    tools:context="com.zhang.zhanglichao1511r0423.MainActivity">

   <ExpandableListView
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:id="@+id/ExpandableListView"
       android:groupIndicator="@null"
       android:layout_weight="1"
       ></ExpandableListView>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="30dp"
    android:orientation="horizontal"
    >
    <CheckBox

        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/quan_bu"
        android:text="全选"
        />
  <TextView
      android:id="@+id/jaiqian"
      android:gravity="center"
      android:layout_weight="1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="0¥"
      />
     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="去结算"
         />
</LinearLayout>
</LinearLayout>
//父xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:layout_height="match_parent">
    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/chx_fu"
        />
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/text_fu"
    />
</LinearLayout>
//子xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:layout_height="match_parent">
    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/chx_zi"
        />
    <ImageView
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:id="@+id/img_zi"
        />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/text_zi"
    />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/text2_zi"
            />
     <com.zhang.zhanglichao1511r0423.Jiajian
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:id="@+id/jiajian"
         ></com.zhang.zhanglichao1511r0423.Jiajian>

    </LinearLayout>
</LinearLayout>
//组合控件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:layout_height="match_parent">
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="+"
    android:id="@+id/jia_jia"
    />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/text_jiajian"
        android:text="1"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="-"
        android:id="@+id/jian_jian"
        />
</LinearLayout>
/**
 * 组合控件类
 * author:Created by WangZhiQiang on 2018/4/23.
 */

public class Jiajian extends LinearLayout {
    public Jiajian(Context context) {
        this(context,null);
    }

    public Jiajian(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
    }

    public Jiajian(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        View inflate = LayoutInflater.from(context).inflate(R.layout.jiajian, this, true);

    }
}
/**
 * MainActivity
 */
public class MainActivity extends AppCompatActivity implements IView<GetCart>{

    private ExpandableListView viewById;
    private Mydaapter mydaapter;
       CheckBox quan_bu;
       TextView jaiqian;

    List<GetCart.DataBean> data=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewById = findViewById(R.id.ExpandableListView);
        quan_bu = findViewById(R.id.quan_bu);
        jaiqian = findViewById(R.id.jaiqian);
        shuju();
        EventBus.getDefault().register(this);

    }
  public void shuju(){
      Mypresenter mypresenter = new Mypresenter();
      HashMap<String, String> map = new HashMap<>();
      map.put("uid","71");
      mypresenter.gerCart(new MyModel(),this,map);

  }
    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
     public  void fff(Boolean f){
      if (f){
          jisuan();
      }

     }

     public void jisuan(){
         int zong = 0;
         for (GetCart.DataBean datum : data) {
             List<GetCart.DataBean.ListBean> list = datum.getList();
             for (GetCart.DataBean.ListBean listBean : list) {
                 int shu = listBean.getShu();
                 int price =(int) listBean.getPrice();
                 boolean flas = listBean.getFlas();
                 if (flas) {
                     if (shu<=0){
                         zong+= 1 * price;
                     }else {
                         zong += shu * price;
                     }
                 }
             }
         }
         jaiqian.setText("价钱:"+zong+"¥");
     }


  //成功
    @Override
    public void onSuccess(GetCart getCart) {
        List<GetCart.DataBean> ll = getCart.getData();
        data.addAll(ll);
        mydaapter = new Mydaapter(this, data);
        viewById.setAdapter(mydaapter);
        //展开列表
        for(int i = 0; i < mydaapter.getGroupCount(); i++){
            viewById.expandGroup(i);
        }

        quxuan(data);
    }

    private void quxuan(final List<GetCart.DataBean> data) {
        quan_bu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                boolean checked = quan_bu.isChecked();

                for (GetCart.DataBean datum : data) {
                    datum.setFal(checked);
                    List<GetCart.DataBean.ListBean> list = datum.getList();
                    for (GetCart.DataBean.ListBean listBean : list) {
                        listBean.setFlas(checked);
                    }
                }
                mydaapter.notifyDataSetChanged();
                jisuan();
            }

        });

    }

    //失败
    @Override
    public void onError(String ss) {
        Toast.makeText(this,ss,Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
}
/**
 * 适配器
 * author:Created by WangZhiQiang on 2018/4/23.
 */

public class Mydaapter extends BaseExpandableListAdapter {
      Context context;
    List<GetCart.DataBean> list;
    int iii=1;

    public Mydaapter(Context context,   List<GetCart.DataBean> list) {
        this.context = context;
        this.list = list;
    }

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

    @Override
    public int getChildrenCount(int groupPosition) {
        return list.get(groupPosition).getList().size();
    }

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

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

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

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

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

    @Override
    public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
       if (convertView==null){
           convertView=View.inflate(context,R.layout.fu_view,null);
       }
        TextView viewById = convertView.findViewById(R.id.text_fu);
        final   CheckBox viewById1 = convertView.findViewById(R.id.chx_fu);
        viewById.setText(list.get(groupPosition).getSellerName());
           boolean fal = list.get(groupPosition).isFal();
           viewById1.setChecked(fal);
        viewById1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                list.get(groupPosition).setFal(viewById1.isChecked());
                notifyDataSetChanged();
                EventBus.getDefault().postSticky(true);
            }
        });

        return convertView;
    }

    @Override
    public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        if (convertView==null){
            convertView=View.inflate(context,R.layout.zi_view,null);
        }
        final CheckBox chx = convertView.findViewById(R.id.chx_zi);
        ImageView img = convertView.findViewById(R.id.img_zi);
        TextView text = convertView.findViewById(R.id.text_zi);
        TextView text2 = convertView.findViewById(R.id.text2_zi);
        Jiajian jiajian = convertView.findViewById(R.id.jiajian);

        final List<GetCart.DataBean.ListBean> data = this.list.get(groupPosition).getList();
        String images = data.get(childPosition).getImages();
        String[] split = images.split(".jpg");
        Glide.with(context).load(split[0]+".jpg").into(img);
        text.setText(data.get(childPosition).getTitle());
        text2.setText(data.get(childPosition).getPscid()+"");
        final boolean fal = list.get(groupPosition).getFal();
        if (fal){
            data.get(childPosition).setFlas(fal);
        }
        chx.setChecked(data.get(childPosition).getFlas());
        chx.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                boolean checked = chx.isChecked();
                data.get(childPosition).setFlas(checked);
                if (!checked) {
                    list.get(groupPosition).setFal(false);
                }
                notifyDataSetChanged();
                EventBus.getDefault().postSticky(true);
            }
        });

        Jiajian jj = convertView.findViewById(R.id.jiajian);
        Button jia_jia = jj.findViewById(R.id.jia_jia);
        Button jian_jian = jj.findViewById(R.id.jian_jian);
        final TextView text_jiajian = jj.findViewById(R.id.text_jiajian);
        jia_jia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {



                iii++;
                data.get(childPosition).setShu(iii);
                text_jiajian.setText(iii+"");

                EventBus.getDefault().postSticky(true);


            }
        });
        jian_jian.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                iii--;
                if (iii<=0){
                    iii = 1;
                }
                data.get(childPosition).setShu(iii);
                text_jiajian.setText(iii+"");
                EventBus.getDefault().postSticky(true);
            }
        });

        return convertView;
    }

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值