当前位置: 移动技术网 > 移动技术>移动开发>Android > Android实现购物车功能

Android实现购物车功能

2019年07月24日  | 移动技术网移动技术  | 我要评论

最近看了一些淘宝购物车的demo,于是也写了一个。

效果图如下:


主要代码如下:
actvity中的代码:

public class shoppingcartactivity extends baseactivity {

  private list<test> data;
  private listview mlistview;
  private shoppingcartadapter adapter;

  private relativelayout rlrefresh;
  private textview tvrefresh;
  private progressbar barrefresh;
  private linearlayout clear;
  private checkbox checkbox_select_all;
  private checkbox checkbox_add;
  private textview integral_sum;
  private int sum = 0;
  private int[] sumintegral;
  private context context;

  @override
  protected void oncreate(bundle bundle) {
    // todo auto-generated method stub
    super.oncreate(bundle);
    setcontentview(r.layout.activity_shopping_cart);
    initview();
  }

  private void initview() {
    context = this;
    showpage = 1;
    ispermitflag = true;
    data = new arraylist<test>();
    // 测试数据
    data.add(new test("id", "color", "type", "100"));
    data.add(new test("id", "color", "type", "200"));
    data.add(new test("id", "color", "type", "300"));
    data.add(new test("id", "color", "type", "0"));
    data.add(new test("id", "color", "type", "300"));
    data.add(new test("id", "color", "type", "100"));
    data.add(new test("id", "color", "type", "500"));
    data.add(new test("id", "color", "type", "0"));
    data.add(new test("id", "color", "type", "900"));

    adapter = new shoppingcartadapter(context, handler, data);

    sumintegral = new int[data.size() + 1];

    checkbox_add = (checkbox) findviewbyid(r.id.checkbox_add);
    integral_sum = (textview) findviewbyid(r.id.integral_sum);
    clear = (linearlayout) findviewbyid(r.id.clear);
    clear.setonclicklistener(new onclicklistener() {

      @override
      public void onclick(view v) {
        data.clear();
        adapter.notifydatasetchanged();
        integral_sum.settext(0 + "");
        checkbox_select_all.setchecked(false);
        checkbox_add.setclickable(false);
      }
    });
    checkbox_select_all = (checkbox) findviewbyid(r.id.checkbox_select);
    checkbox_select_all.setonclicklistener(new onclicklistener() {

      @override
      public void onclick(view v) {

        hashmap<integer, boolean> isselected = shoppingcartadapter
            .getisselected();
        iterator iterator = isselected.entryset().iterator();
        list<boolean> array = new arraylist<boolean>();//列表中checkbox选中状态
        list<integer> nums = new arraylist<integer>();//列表中商品数量
        while (iterator.hasnext()) {
          hashmap.entry entry = (hashmap.entry) iterator.next();
          integer key = (integer) entry.getkey();
          boolean val = (boolean) entry.getvalue();
          array.add(val);
        }
        for (int i = 0; i < data.size(); i++) {
          int num = data.get(i).getnum();
          int integral = integer.valueof(data.get(i).getintegral());
          nums.add(num);
        }
        if (checkbox_select_all.ischecked()) {

          for (int i = 0; i < data.size(); i++) {
            shoppingcartadapter.getisselected().put(i, true);
          }
          checkbox_add.setchecked(true);
          adapter.notifydatasetchanged();
        } else {
          for (int i = 0; i < data.size(); i++) {
            shoppingcartadapter.getisselected().put(i, false);
          }
          checkbox_add.setchecked(false);
          adapter.notifydatasetchanged();
          integral_sum.settext(0 + "");
        }

      }
    });
    mlistview= (listview) findviewbyid(r.id.finance_list);
    mlistview.setadapter(adapter);
    mlistview.setonitemclicklistener(new onitemclicklistener() {

      @override
      public void onitemclick(adapterview<?> parent, view view,
          int position, long id) {
        toast.maketext(context, position + "", toast.length_long)
            .show();

        int pos = position - 1;
        viewholder viewholder = (viewholder) view.gettag();
        int num = data.get(pos).getnum();
        if (num == 0) {
          toast.maketext(context, "请选择商品数量", toast.length_long)
              .show();
        } else {
          boolean cu = !shoppingcartadapter.getisselected().get(pos);
          shoppingcartadapter.getisselected().put(pos, cu);
          adapter.notifydatasetchanged();
          //遍历获取列表中checkbox的选中状态
          hashmap<integer, boolean> isselected = shoppingcartadapter
              .getisselected();
          iterator iterator = isselected.entryset().iterator();
          list<boolean> array = new arraylist<boolean>();
          while (iterator.hasnext()) {
            hashmap.entry entry = (hashmap.entry) iterator.next();
            integer key = (integer) entry.getkey();
            boolean val = (boolean) entry.getvalue();
            array.add(val);
          }
          if (test.isallfalse(array)) {
            checkbox_select_all.setchecked(false);
            checkbox_add.setchecked(false);
          }
          if (test.isalltrue(array)) {
            checkbox_select_all.setchecked(true);
            checkbox_add.setchecked(true);
          }
          if (test.ishaveonefasle(array)) {
            checkbox_select_all.setchecked(false);
          }
          if (test.ishaveonetrue(array)) {
            checkbox_add.setchecked(true);
          }
        }
      }
    });
  }

  @suppresslint("handlerleak")
  private handler handler = new handler(){
    @suppresswarnings("unchecked")
    @override
    public void handlemessage(message msg) {
      super.handlemessage(msg);
      if(msg.what == 10){ //更改选中商品的总价格
        float price = (float)msg.obj;
        if(price > 0){
          integral_sum.settext(price+"");
        }else{
          integral_sum.settext("0");
        }
      }
      else if(msg.what == 11){
        //列表选中状态
        list<boolean> array = (list<boolean>) msg.obj;
        if (test.isallfalse(array)) {
          checkbox_select_all.setchecked(false);
          checkbox_add.setchecked(false);
        }
        if (.isalltrue(array)) {
          checkbox_select_all.setchecked(true);
          checkbox_add.setchecked(true);
        }
        if (test.ishaveonefasle(array)) {
          checkbox_select_all.setchecked(false);
        }
        if (test.ishaveonetrue(array)) {
          checkbox_add.setchecked(true);
        }
      }
    }
  };

actvity中xml的代码:

<?xml version="1.0" encoding="utf-8"?>
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:header=http://schemas.android.com/apk/res/com.sxc.test"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@color/app_background"
  android:orientation="vertical" >

  <com.autoserve.core.widget.headerwidget
    android:id="@+id/header"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignparenttop="true"
    header:text="我的购物车" />

  <linearlayout
    android:id="@+id/layout1"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:layout_below="@id/header"
    android:layout_gravity="center"
    android:layout_margintop="20dp"
    android:background="@color/white"
    android:orientation="horizontal" >

    <linearlayout
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_marginleft="10dp"
      android:layout_weight="1"
      android:gravity="center_vertical"
      android:orientation="horizontal" >

      <checkbox
        android:id="@+id/checkbox_select"
        style="@style/customcheckboxtheme"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

      <textview
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginleft="10dp"
        android:text="全选"
        android:textcolor="@color/gry_666666"
        android:textsize="@dimen/small_size" />
    </linearlayout>

    <linearlayout
      android:id="@+id/clear"
      android:layout_width="wrap_content"
      android:layout_height="match_parent"
      android:layout_marginright="20dp"
      android:gravity="center_vertical|right"
      android:orientation="horizontal" >

      <checkbox
        android:layout_width="12dp"
        android:layout_height="12dp"
        android:background="@drawable/clear" />

      <textview
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginleft="5dp"
        android:text="清空购物车"
        android:textcolor="#b61d1d"
        android:textsize="@dimen/small_size" />
    </linearlayout>
  </linearlayout>

  <linearlayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/layout1"
    android:layout_marginbottom="50dp"
    android:orientation="vertical" >

    <view
      android:layout_width="match_parent"
      android:layout_height="0.1dp"
      android:background="@color/divider_color" />

    <listview
      android:id="@+id/finance_list"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:clickable="false"
      android:divider="@color/lucency" />

    <include
      layout="@layout/include_refresh"
      android:visibility="gone" />
  </linearlayout>

  <linearlayout
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_alignparentbottom="true"
    android:orientation="horizontal" >

    <linearlayout
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="2"
      android:background="@color/gry_999999"
      android:gravity="center_vertical"
      android:orientation="horizontal" >

      <linearlayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginleft="5dp"
        android:layout_marginright="5dp"
        android:gravity="center"
        android:orientation="horizontal" >

        <checkbox
          android:id="@+id/checkbox_add"
          style="@style/customcheckboxtheme2"
          android:layout_width="wrap_content"
          android:clickable="false"
          android:layout_height="wrap_content" />
      </linearlayout>

      <linearlayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="horizontal" >

        <textview
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="合计:"
          android:textcolor="@color/white"
          android:textsize="@dimen/small_size" />

        <textview
          android:id="@+id/integral_sum"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginleft="5dp"
          android:layout_marginright="5dp"
          android:text="0"
          android:textcolor="@color/theme_color"
          android:textsize="@dimen/small_size" />

        <textview
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="积分"
          android:textcolor="@color/white"
          android:textsize="@dimen/small_size" />
      </linearlayout>
    </linearlayout>

    <textview
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="1"
      android:background="@color/theme_color"
      android:gravity="center"
      android:text="结算"
      android:textcolor="@color/white"
      android:textsize="@dimen/small_size" />
  </linearlayout>

</relativelayout>

-xml中头部可以到网上找一个这里就不放上来了
.checkbox和button的样式可以根据个人喜好设置。

adaper中的代码:

public class shoppingcartadapter extends baseadapter {

  private context context;
  private list<test> loans;
  private layoutinflater inflater;
  private static hashmap<integer, boolean> isselected;
  private static hashmap<integer, integer> numbers;
  private handler handler;
  int num;// 商品数量

  static class viewholder { // 自定义控件集合
    public checkbox ck_select;
    public imageview pic_goods;
    public textview id_goods;
    public textview color_goods;
    public textview type_goods;
    public textview integral_goods;
    public addminuswidget add_minus;
    public linearlayout layout;
    public textview number;
    public button minus;
    public button plus;
  }

  /**
   * 实例化adapter
   * 
   * @param context
   * @param data
   */
  public shoppingcartadapter(context context, handler handler, list<test> data) {
    this.context = context;
    this.inflater = layoutinflater.from(context);
    this.loans = data;
    this.handler = handler;
    isselected = new hashmap<integer, boolean>();
    numbers = new hashmap<integer, integer>();
    initdate();
  }

  private void initdate() {
    for (int i = 0; i < loans.size(); i++) {
      getisselected().put(i, false);
      getnumbers().put(i, 1);
    }
  }

  @override
  public int getcount() {
    return loans.size();
  }

  @override
  public object getitem(int position) {
    return loans.get(position);
  }

  @override
  public long getitemid(int position) {
    return position;
  }

  @override
  public view getview(final int position, view convertview, viewgroup parent) {
    // 自定义视图
    viewholder itemview = null;
    if (convertview == null) {
      // 获取list_item布局文件的视图
      itemview = new viewholder();
      convertview = inflater.inflate(r.layout.list_shopping_cart_item,
          null);
      // 获取控件对象
      itemview.ck_select = (checkbox) convertview
          .findviewbyid(r.id.ck_select);
      itemview.pic_goods = (imageview) convertview
          .findviewbyid(r.id.pic_goods);
      itemview.id_goods = (textview) convertview
          .findviewbyid(r.id.id_goods);
      itemview.color_goods = (textview) convertview
          .findviewbyid(r.id.color_goods);
      itemview.type_goods = (textview) convertview
          .findviewbyid(r.id.type_goods);
      itemview.integral_goods = (textview) convertview
          .findviewbyid(r.id.integral_goods);
      itemview.number = (textview) convertview.findviewbyid(r.id.number);
      itemview.minus = (button) convertview.findviewbyid(r.id.minus);
      itemview.plus = (button) convertview.findviewbyid(r.id.plus);
      convertview.settag(itemview);
    } else {
      itemview = (viewholder) convertview.gettag();
    }

    init(itemview, position);

    itemview.ck_select.setchecked(getisselected().get(position));
    itemview.number.settext(getnumbers().get(position).tostring());
    if (getisselected().get(position)) {
      itemview.ck_select.setchecked(true);
    } else {
      itemview.ck_select.setchecked(false);
    }

    string a = itemview.number.gettext().tostring();
    loans.get(position).setnum(integer.valueof(a));

    test test = loans.get(position);
    itemview.id_goods.settext((charsequence) test.getid());
    itemview.color_goods.settext((charsequence) test.getcolor());
    itemview.type_goods.settext((charsequence) test.gettype());
    itemview.integral_goods.settext((charsequence) test.getintegral());
    itemview.pic_goods.setimageresource(r.drawable.shopping);
    return convertview;
  }

  private void init(final viewholder itemview, final int position) {

    itemview.ck_select
        .setoncheckedchangelistener(new oncheckedchangelistener() {

          @override
          public void oncheckedchanged(compoundbutton buttonview,
              boolean ischecked) {
            isselected.put(position, true);
            getisselected().put(position, ischecked);
            itemview.ck_select.setchecked(getisselected().get(
                position));
            handler.sendmessage(handler.obtainmessage(10,
                gettotalprice()));

            iterator iterator = isselected.entryset().iterator();
            list<boolean> array = new arraylist<boolean>();
            while (iterator.hasnext()) {
              hashmap.entry entry = (hashmap.entry) iterator
                  .next();
              integer key = (integer) entry.getkey();
              boolean val = (boolean) entry.getvalue();
              array.add(val);
            }
            handler.sendmessage(handler.obtainmessage(11, array));
          }
        });

    final string numstring = itemview.number.gettext().tostring();
    itemview.plus.setonclicklistener(new onclicklistener() {

      @override
      public void onclick(view v) {

        if (numstring == null || numstring.equals("")) {
          num = 1;
          itemview.number.settext("1");
        } else {
          if (++num < 1) // 先加,再判断
          {
            num--;

            toast.maketext(context, "请输入一个大于0的数字",
                toast.length_short).show();
          } else {
            itemview.number.settext(string.valueof(num));
            loans.get(position).setnum(num);
            numbers.put(position, num);
            handler.sendmessage(handler.obtainmessage(10,
                gettotalprice()));
            log.i("test", "+:" + num);
          }
        }
      }
    });
    itemview.minus.setonclicklistener(new onclicklistener() {

      @override
      public void onclick(view v) {

        if (numstring == null || numstring.equals("")) {
          num = 1;
          itemview.number.settext("1");
        } else {
          if (--num < 1) // 先加,再判断
          {
            num++;
            log.i("test", "-:" + num);
            toast.maketext(context, "请输入一个大于0的数字",
                toast.length_short).show();
            log.i("test", "-:" + num);
          } else {
            itemview.number.settext(string.valueof(num));
            log.i("test", "-:" + num);
            loans.get(position).setnum(num);
            numbers.put(position, num);
            handler.sendmessage(handler.obtainmessage(10,
                gettotalprice()));
          }
        }

      }
    });

  }

  /**
   * 计算选中商品的积分
   * 
   * @return 返回需要付费的总积分
   */
  private float gettotalprice() {
    test bean = null;
    float totalprice = 0;
    for (int i = 0; i < loans.size(); i++) {
      bean = loans.get(i);
      if (shoppingcartadapter.getisselected().get(i)) {
        totalprice += bean.getnum()
            * integer.valueof(bean.getintegral());
      }
    }
    return totalprice;
  }

  public static hashmap<integer, boolean> getisselected() {
    return isselected;
  }

  public static void setisselected(hashmap<integer, boolean> isselected) {
    shoppingcartadapter.isselected = isselected;
  }

  public static hashmap<integer, integer> getnumbers() {
    return numbers;
  }

  public static void setnumbers(hashmap<integer, integer> numbers) {
    shoppingcartadapter.numbers = numbers;
  }
}

adapter中的xml代码:

<?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:descendantfocusability="blocksdescendants"
  android:background="@color/white"

  android:orientation="vertical" >
  <view
    android:layout_width="match_parent"
    android:layout_height="0.1dp"
    android:background="@color/divider_color" />

  <linearlayout
    android:id="@+id/layout5"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:padding="5dp" >

    <checkbox
      android:id="@+id/ck_select"
      style="@style/customcheckboxtheme"
      android:layout_width="wrap_content"
      android:focusable="false"
      android:layout_height="wrap_content"
      android:layout_marginright="5dp" />

    <imageview
      android:id="@+id/pic_goods"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:scaletype="fitcenter"
      android:src="@drawable/shopping" />

    <linearlayout
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_marginleft="10dp"
      android:orientation="vertical" >

      <textview
        android:id="@+id/id_goods"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="短袜男士星期 polo棉袜潮男秋冬款礼盒装"
        android:textcolor="@color/gry_999999"
        android:textsize="@dimen/small_size" />

      <linearlayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <linearlayout
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:orientation="vertical" >

          <linearlayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <textview
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="颜色:"
              android:textcolor="@color/gry_999999"
              android:textsize="12sp" />

            <textview
              android:id="@+id/color_goods"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="黑色"
              android:textcolor="@color/gry_999999"
              android:textsize="12sp" />
          </linearlayout>

          <linearlayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <textview
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="规格:"
              android:textcolor="@color/gry_999999"
              android:textsize="12sp" />

            <textview
              android:id="@+id/type_goods"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="普通"
              android:textcolor="@color/gry_999999"
              android:textsize="12sp" />
          </linearlayout>

          <linearlayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <textview
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="所需积分"
              android:textcolor="@color/theme_color"
              android:textsize="12sp" />

            <textview
              android:id="@+id/integral_goods"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="1000"
              android:layout_marginleft="5dp"
              android:textcolor="@color/theme_color"
              android:textsize="12sp" />
          </linearlayout>
        </linearlayout>

        <linearlayout
          android:layout_width="match_parent"
          android:layout_height="25dp"
          android:layout_gravity="bottom"
          android:layout_marginbottom="5dp"
          android:layout_marginright="5dp"
          android:gravity="right"
          android:orientation="horizontal" >

          <linearlayout
    android:layout_width="80dp"
    android:layout_height="25dp"
    android:layout_gravity="right"
    android:background="@color/white"
    android:orientation="horizontal" >

    <button
      android:id="@+id/minus"
      android:layout_width="25dp"
      android:layout_height="match_parent"
      android:background="@drawable/kuangzi1"
      android:gravity="center"
      android:focusable="false"
      android:text="-"
      android:textcolor="@color/black" >
    </button>

    <textview
      android:id="@+id/number"
      android:layout_width="30dp"
      android:layout_height="match_parent"
      android:background="@drawable/kuangzi1"
      android:gravity="center"
      android:inputtype="number"
      android:text="1"
      android:textcolor="@color/black" >
    </textview>

    <button
      android:id="@+id/plus"
      android:layout_width="25dp"
      android:layout_height="match_parent"
      android:background="@drawable/kuangzi1"
      android:gravity="center"
      android:focusable="false"
      android:text="+"
      android:textcolor="@color/black" >
    </button>
  </linearlayout>
        </linearlayout>
      </linearlayout>
    </linearlayout>
  </linearlayout>

  <view
    android:layout_width="match_parent"
    android:layout_height="0.1dp"
    android:background="@color/divider_color" />

</linearlayout>

实体类:

package com.autoserve.net33.model;


public class test {
  @override
  public string tostring() {
    return "test [id=" + id + ", color=" + color
        + ", type=" + type + ", integral=" + integral + "]";
  }

  public string getid() {
    return id;
  }
  public void setid(string id) {
    this.id = id;
  }
  public string getcolor() {
    return color;
  }
  public void setcolor(string color) {
    this.color = color;
  }
  public string gettype() {
    return type;
  }
  public void settype(string type) {
    this.type = type;
  }
  public string getintegral() {
    return integral;
  }
  public void setintegral(string integral) {
    this.integral = integral;
  }
  private string id;
  private string color;
  private string type;
  private string integral;
  private int num;//商品数量
  private int sumintegral;
  private boolean ischoosed;   //商品是否在购物车中被选中

  public test(string id, string color, string type, string integral) {
    super();
    this.id = id;
    this.color = color;
    this.type = type;
    this.integral = integral;
  }
  public test() {
    super();
  }

  public int getnum() {
    return num;
  }

  public void setnum(int num) {
    this.num = num;
  }

  public int getsumintegral() {
    return sumintegral;
  }

  public void setsumintegral(int sumintegral) {
    this.sumintegral = sumintegral;
  }

  public boolean ischoosed() {
    return ischoosed;
  }

  public void setchoosed(boolean ischoosed) {
    this.ischoosed = ischoosed;
  }  
}

以上就是本文的全部内容,祝大家在新的一年里工作顺利,事事顺心,我们大家共同努力。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网