您的位置:首页 > 移动开发 > Android开发

商城购物车业务逻辑

2017-10-27 20:19 681 查看
业务逻辑分为以下几个部分:

          1.首先是所购商品和所购商品所在店的对象的设计,其中关键的是商品和店铺都各自拥有是否在编辑状态与编辑完成这个boolean isEditing进行判断,对于商品的数目还存在一个编辑前的数目和编辑后的数目两个属性

          2.商铺的全选与商铺下所有商品的全选

              对于全选与单选的逻辑处理是以单选结果为准

             1.每次单选一个商品后就对其所在的商铺的其他商品进行遍历,以此结果判断该商铺的所有商品是否都被选中;然后再对每一个商铺是否被选中进行判断,以此判断是否全选;

             2.对于商铺的单选,每次拿到商铺得状态之后取反,然后把它赋值给它里面的每一个商品;然后拿着商铺再次进行所有商铺的遍历得出是否全选

            3.点击全选,取反,遍历拿到每一个进行设置,返回boolean

        3.在编辑状态下商品数目的改变是如何进行的          

              商品的增加与减少的业务逻辑的核心是对标记setTag()的使用:我们在点击增加按钮时,首先通过标记拿到是哪一个商铺的哪一个商品,然后通过该增加按钮我们(getParent().findById(显示的数目控件))。所以我们就可以拿到该商品的数目进行增加最后赋值就可以了

   4.商品结算

            1.拿到整个集合,遍历获得每一个商品,进行选中判断

            2.选中则拿到数量和价格进行乘法与累加,用String[]数组装着

            3.写一个借口传递出去

  MyExpandableListAdapter.java

  
package com.shixu.tbcart.adapter;

import android.content.Context;
import android.graphics.Paint;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.shixu.tbcart.R;
import com.shixu.tbcart.entity.ShoppingCartBean;
import com.shixu.tbcart.listener.OnShoppingCartChangeListener;
import com.shixu.tbcart.listener.ShoppingCartBiz;
import com.shixu.tbcart.utils.ToastHelper;
import com.shixu.tbcart.view.UIAlertView;

import java.util.ArrayList;
import java.util.List;

public class MyExpandableListAdapter extends BaseExpandableListAdapter {
private Context mContext;
private List<ShoppingCartBean> mListGoods = new ArrayList<ShoppingCartBean>();
private OnShoppingCartChangeListener mChangeListener;
private boolean isSelectAll = false;

public MyExpandableListAdapter(Context context) {
mContext = context;
}

public void setList(List<ShoppingCartBean> mListGoods) {
this.mListGoods = mListGoods;
setSettleInfo();
}

public void setOnShoppingCartChangeListener(OnShoppingCartChangeListener changeListener) {
this.mChangeListener = changeListener;
}

public View.OnClickListener getAdapterListener() {
return listener;
}

public int getGroupCount() {
return mListGoods.size();
}

public int getChildrenCount(int groupPosition) {
return mListGoods.get(groupPosition).getGoods().size();
}

public Object getGroup(int groupPosition) {
return mListGoods.get(groupPosition);
}

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

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

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

public boolean hasStableIds() {
return false;
}

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
GroupViewHolder holder = null;
if (convertView == null) {
holder = new GroupViewHolder();
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_elv_group_test, parent, false);
holder.tvGroup = (TextView) convertView.findViewById(R.id.tvShopNameGroup);
holder.tvEdit = (TextView) convertView.findViewById(R.id.tvEdit);
holder.ivCheckGroup = (ImageView) convertView.findViewById(R.id.ivCheckGroup);
convertView.setTag(holder);
} else {
holder = (GroupViewHolder) convertView.getTag();
}
holder.tvGroup.setText(mListGoods.get(groupPosition).getMerchantName());
ShoppingCartBiz.checkItem(mListGoods.get(groupPosition).isGroupSelected(), holder.ivCheckGroup);
boolean isEditing = mListGoods.get(groupPosition).isEditing();
if (isEditing) {
holder.tvEdit.setText("完成");
} else {
holder.tvEdit.setText("编辑");
}
holder.ivCheckGroup.setTag(groupPosition);
holder.ivCheckGroup.setOnClickListener(listener);
holder.tvEdit.setTag(groupPosition);
holder.tvEdit.setOnClickListener(listener);
holder.tvGroup.setOnClickListener(listener);
return convertView;
}

/**
* child view
*/

public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ChildViewHolder holder = null;
if (convertView == null) {
holder = new ChildViewHolder();
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_elv_child_test, parent, false);
holder.tvChild = (TextView) convertView.findViewById(R.id.tvItemChild);
holder.tvDel = (TextView) convertView.findViewById(R.id.tvDel);
holder.ivCheckGood = (ImageView) convertView.findViewById(R.id.ivCheckGood);
holder.rlEditStatus = (RelativeLayout) convertView.findViewById(R.id.rlEditStatus);
holder.llGoodInfo = (LinearLayout) convertView.findViewById(R.id.llGoodInfo);
holder.ivAdd = (ImageView) convertView.findViewById(R.id.ivAdd);
holder.ivReduce = (ImageView) convertView.findViewById(R.id.ivReduce);
holder.tvGoodsParam = (TextView) convertView.findViewById(R.id.tvGoodsParam);
holder.tvPriceNew = (TextView) convertView.findViewById(R.id.tvPriceNew);
holder.tvPriceOld = (TextView) convertView.findViewById(R.id.tvPriceOld);
holder.tvPriceOld.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);//数字被划掉效果
holder.tvNum = (TextView) convertView.findViewById(R.id.tvNum);
holder.tvNum2 = (TextView) convertView.findViewById(R.id.tvNum2);
convertView.setTag(holder);
} else {
holder = (ChildViewHolder) convertView.getTag();
}
ShoppingCartBean.Goods goods = mListGoods.get(groupPosition).getGoods().get(childPosition);
boolean isChildSelected = mListGoods.get(groupPosition).getGoods().get(childPosition).isChildSelected();
boolean isEditing = goods.isEditing();
String priceNew = "¥" + goods.getPrice();
String priceOld = "¥" + goods.getMkPrice();
String num = goods.getNumber();
String pdtDesc = goods.getPdtDesc();
String goodName = mListGoods.get(groupPosition).getGoods().get(childPosition).getGoodsName();

holder.ivCheckGood.setTag(groupPosition + "," + childPosition);
holder.tvChild.setText(goodName);
holder.tvPriceNew.setText(priceNew);
holder.tvPriceOld.setText(priceOld);
holder.tvNum.setText("X " + num);
holder.tvNum2.setText(num);
holder.tvGoodsParam.setText(pdtDesc);

holder.ivAdd.setTag(goods);
holder.ivReduce.setTag(goods);
holder.tvDel.setTag(groupPosition + "," + childPosition);
holder.tvDel.setTag(groupPosition + "," + childPosition);

ShoppingCartBiz.checkItem(isChildSelected, holder.ivCheckGood);
if (isEditing) {
holder.llGoodInfo.setVisibility(View.GONE);
holder.rlEditStatus.setVisibility(View.VISIBLE);
} else {
holder.llGoodInfo.setVisibility(View.VISIBLE);
holder.rlEditStatus.setVisibility(View.GONE);
}

holder.ivCheckGood.setOnClickListener(listener);
holder.tvDel.setOnClickListener(listener);
holder.ivAdd.setOnClickListener(listener);
holder.ivReduce.setOnClickListener(listener);
holder.llGoodInfo.setOnClickListener(listener);
return convertView;
}

public boolean isChildSelectable(int i, int i1) {
return false;
}

View.OnClickListener listener = new View.OnClickListener() {

public void onClick(View v) {
switch (v.getId()) {
//main
case R.id.ivSelectAll:
isSelectAll = ShoppingCartBiz.selectAll(mListGoods, isSelectAll, (ImageView) v);
setSettleInfo();
notifyDataSetChanged();
break;
case R.id.tvEditAll:
break;
case R.id.btnSettle:
if (ShoppingCartBiz.hasSelectedGoods(mListGoods)) {
ToastHelper.getInstance()._toast("结算跳转");
} else {
ToastHelper.getInstance()._toast("亲,先选择商品!");
}
//group
break;
case R.id.tvEdit://切换界面,属于特殊处理,假如没打算切换界面,则不需要这块代码
int groupPosition2 = Integer.parseInt(String.valueOf(v.getTag()));
boolean isEditing = !(mListGoods.get(groupPosition2).isEditing());
mListGoods.get(groupPosition2).setIsEditing(isEditing);
for (int i = 0; i < mListGoods.get(groupPosition2).getGoods().size(); i++) {
mListGoods.get(groupPosition2).getGoods().get(i).setIsEditing(isEditing);
}
notifyDataSetChanged();
break;
case R.id.ivCheckGroup:
int groupPosition3 = Integer.parseInt(String.valueOf(v.getTag()));
isSelectAll = ShoppingCartBiz.selectGroup(mListGoods, groupPosition3);
selectAll();
setSettleInfo();
notifyDataSetChanged();
break;
//child
case R.id.ivCheckGood:
String tag = String.valueOf(v.getTag());
if (tag.contains(",")) {
String s[] = tag.split(",");
int groupPosition = Integer.parseInt(s[0]);
int childPosition = Integer.parseInt(s[1]);
isSelectAll = ShoppingCartBiz.selectOne(mListGoods, groupPosition, childPosition);
selectAll();
setSettleInfo();
notifyDataSetChanged();
}
break;
case R.id.tvDel:
String tagPos = String.valueOf(v.getTag());
if (tagPos.contains(",")) {
String s[] = tagPos.split(",");
int groupPosition = Integer.parseInt(s[0]);
int childPosition = Integer.parseInt(s[1]);
showDelDialog(groupPosition, childPosition);
}
break;
case R.id.ivAdd:
ShoppingCartBiz.addOrReduceGoodsNum(true, (ShoppingCartBean.Goods) v.getTag(), ((TextView) (((View) (v.getParent())).findViewById(R.id.tvNum2))));
setSettleInfo();
break;
case R.id.ivReduce:
ShoppingCartBiz.addOrReduceGoodsNum(false, (ShoppingCartBean.Goods) v.getTag(), ((TextView) (((View) (v.getParent())).findViewById(R.id.tvNum2))));
setSettleInfo();
break;
case R.id.llGoodInfo:
ToastHelper.getInstance()._toast("商品详情,暂未实现");
break;
case R.id.tvShopNameGroup:
ToastHelper.getInstance()._toast("商铺详情,暂未实现");
break;
}
}
};

private void selectAll() {
if (mChangeListener != null) {
mChangeListener.onSelectItem(isSelectAll);
}
}

private void setSettleInfo() {
String[] infos = ShoppingCartBiz.getShoppingCount(mListGoods);
//删除或者选择商品之后,需要通知结算按钮,更新自己的数据;
if (mChangeListener != null && infos != null) {
mChangeListener.onDataChange(infos[0], infos[1]);
}
}

private void showDelDialog(final int groupPosition, final int childPosition) {
final UIAlertView delDialog = new UIAlertView(mContext, "温馨提示", "确认删除该商品吗?",
"取消", "确定");
delDialog.show();

delDialog.setClicklistener(new UIAlertView.ClickListenerInterface() {

public void doLeft() {
delDialog.dismiss();
}

public void doRight() {
String productID = mListGoods.get(groupPosition).getGoods().get(childPosition).getProductID();
ShoppingCartBiz.delGood(productID);
delGoods(groupPosition, childPosition);
setSettleInfo();
notifyDataSetChanged();
delDialog.dismiss();
}
}
);
}

private void delGoods(int groupPosition, int childPosition) {
mListGoods.get(groupPosition).getGoods().remove(childPosition);
if (mListGoods.get(groupPosition).getGoods().size() == 0) {
mListGoods.remove(groupPosition);
}
notifyDataSetChanged();
}

class GroupViewHolder {
TextView tvGroup;
TextView tvEdit;
ImageView ivCheckGroup;
}

class ChildViewHolder {
/** 商品名称 */
TextView tvChild;
/** 商品规格 */
TextView tvGoodsParam;
/** 选中 */
ImageView ivCheckGood;
/** 非编辑状态 */
LinearLayout llGoodInfo;
/** 编辑状态 */
RelativeLayout rlEditStatus;
/** +1 */
ImageView ivAdd;
/** -1 */
ImageView ivReduce;
/** 删除 */
TextView tvDel;
/** 新价格 */
TextView tvPriceNew;
/** 旧价格 */
TextView tvPriceOld;
/** 商品状态的数量 */
TextView tvNum;
/** 编辑状态的数量 */
TextView tvNum2;
}
}


布局文件

  activity_shopping_cart.xml

  <?xml version="1.0" encoding="utf-8"?>

<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"

    tools:context=".ShoppingCartActivity">

    <include

        android:id="@+id/rlTitleBar"

        layout="@layout/include_topbar"

        />

    <RelativeLayout

        android:id="@+id/rlShoppingCartEmpty"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:layout_alignParentBottom="true"

        android:layout_below="@+id/rlTitleBar"

        android:background="#FCFCFC"

        android:visibility="invisible">

        <ImageView

            android:id="@+id/imageView"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_centerHorizontal="true"

            android:layout_centerVertical="true"

            android:background="@drawable/ic_shopping_cart_empty"/>

        <TextView

            android:id="@+id/textView"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_below="@+id/imageView"

            android:layout_centerHorizontal="true"

            android:layout_marginTop="10dp"

            android:text="购物车为空"/>

    </RelativeLayout>

    <ExpandableListView

        android:id="@+id/expandableListView"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_above="@+id/rlBottomBar"

        android:layout_below="@+id/rlTitleBar"

        android:dividerHeight="0.5dp"

        android:listSelector="#00000000"

        android:longClickable="true"/>

    <RelativeLayout

        android:id="@+id/rlBottomBar"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_alignParentBottom="true"

        android:background="@color/white">

        <ImageView

        android:layout_width="match_parent"

        android:layout_height="0.5dp"

        android:layout_alignParentTop="true"

        android:background="#ccc"/>

        <ImageView

            android:id="@+id/ivSelectAll"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_centerVertical="true"

            android:layout_marginLeft="10dp"

            android:background="@drawable/ic_uncheck"/>

        <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_centerVertical="true"

            android:layout_marginLeft="5dp"

            android:layout_toRightOf="@+id/ivSelectAll"

            android:text="全选"

            android:textColor="#003333"

            android:textSize="13sp"/>

        <LinearLayout

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_alignParentRight="true"

            android:orientation="horizontal">

            <LinearLayout

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:orientation="vertical">

                <TextView

                    android:id="@+id/tvCountMoney"

                    android:layout_width="wrap_content"

                    android:layout_height="wrap_content"

                    android:layout_marginRight="5dp"

                    android:layout_marginTop="5dp"

                    android:gravity="right"

                    android:text="@string/count_money"

                    android:textColor="#ff2600"

                    android:textSize="13sp"/>

                <TextView

                    android:id="@+id/tvPostPrice"

                    android:layout_width="match_parent"

                    android:layout_height="wrap_content"

                    android:layout_marginBottom="5dp"

                    android:layout_marginRight="5dp"

                    android:layout_marginTop="5dp"

                    android:gravity="right"

                    android:text="不含运费"

                    android:textColor="#666666"

                    android:textSize="11sp"/>

            </LinearLayout>

            <TextView

                android:id="@+id/btnSettle"

                android:layout_width="wrap_content"

                android:layout_height="match_parent"

                android:background="#ff5000"

                android:gravity="center_vertical"

                android:paddingBottom="5dp"

                android:paddingLeft="20dp"

                android:paddingRight="20dp"

                android:paddingTop="5dp"

                android:text="@string/count_goods"

                android:textColor="#FFF"

                android:textSize="14sp"/>

        </LinearLayout>

    </RelativeLayout>

</RelativeLayout>

item_elv_child_test.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="#EEEEEE">

<ImageView
android:id="@+id/ivCheckGood"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginBottom="10dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:background="@drawable/ic_uncheck"/>

<ImageView
android:id="@+id/ivGoods"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerVertical="true"
android:layout_marginBottom="5dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"

android:layout_toRightOf="@+id/ivCheckGood"
android:background="@drawable/test_goods"/>

<LinearLayout
android:id="@+id/llGoodInfo"
android:layout_width="wrap_content"
android:layout_height="80dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_toRightOf="@+id/ivGoods"
android:gravity="center_vertical"
android:orientation="vertical"
android:visibility="visible"
android:weightSum="3">

<TextView
android:id="@+id/tvItemChild"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="top"
android:layout_marginTop="2dp"
android:layout_weight="1"
android:text="商品名称"
android:textColor="#003333"
android:textSize="12sp"/>

<TextView
android:id="@+id/tvGoodsParam"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="2dp"
android:layout_weight="1"
android:gravity="top"
android:text="商品规格"
android:textColor="#7f7f7f"
android:textSize="12sp"/>

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

<TextView
android:id="@+id/tvPriceNew"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"

android:gravity="bottom"
android:text="当前价格"
android:textColor="#ff3a00"
android:textSize="12sp"/>

<TextView
android:id="@+id/tvNum"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

android:layout_alignParentRight="true"
android:layout_alignTop="@+id/tvPriceNew"
android:gravity="bottom"
android:text="X 1"
android:textColor="#333333"
android:textSize="12sp"/>

<TextView
android:id="@+id/tvPriceOld"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginLeft="5dp"

android:layout_toRightOf="@+id/tvPriceNew"
android:gravity="bottom"
android:text="原先价格"
android:textColor="#8e8e8e"
android:textSize="12sp"/>
</RelativeLayout>

</LinearLayout>

<RelativeLayout
android:id="@+id/rlEditStatus"
android:layout_width="wrap_content"
android:layout_height="90dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/ivGoods"
android:orientation="horizontal"
android:visibility="gone"
>

<LinearLayout
android:id="@+id/llGoodLeft"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/tvDel"
>

<ImageView
android:id="@+id/ivAdd"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/ic_add"/>

<TextView
android:id="@+id/tvNum2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal|center_vertical"
android:text="1"/>

<ImageView
android:id="@+id/ivReduce"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/ic_reduce"/>

</LinearLayout>

<TextView
android:id="@+id/tvDel"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:background="#ff5000"
android:gravity="center_vertical"
android:paddingLeft="7.5dp"
android:paddingRight="7.5dp"
android:text="删除"
android:textColor="#FFF"
android:textSize="14sp"/>

</RelativeLayout>

</RelativeLayout>

item_elv_group_test.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="@color/white">

<ImageView
android:id="@+id/ivCheckGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginBottom="10dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:background="@drawable/ic_uncheck"/>

<ImageView

android:id="@+id/imageView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/ivCheckGroup"
android:background="@drawable/ic_shop"/>

<TextView
android:id="@+id/tvShopNameGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/imageView2"
android:text="商家名称"
android:textColor="#003333"
android:textSize="12sp"/>

<ImageView
android:id="@+id/ivShopArrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/tvShopNameGroup"
android:background="@drawable/ic_arrow"/>

<View
android:id="@+id/imageView4"
android:layout_width="1dp"
android:layout_height="10dp"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/tvEdit"
android:background="#cccccc"/>

<TextView
android:id="@+id/tvEdit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:text="@string/edit"
android:textColor="#003333"
android:textSize="12sp"/>

</RelativeLayout>

结果显示



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  商城 android