本文为大家讲解了Android实现购物车的整体页面逻辑,供大家参考,具体内容如下
MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ String url = "http://www.zhaoapi.cn/product/getCarts"; private ExpandableListView el_cart; private CheckBox cb_cart_all_select; private TextView tv_cart_total_price; private Button btn_cart_pay; MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); } private void initData() { HashMap<String, String> map = new HashMap<>(); map.put("uid","71"); OkhtttpUtils.getInstance().doPost(url, map, new OkhtttpUtils.OkCallback() { @Override public void onFailure(Exception e) { } @Override public void onResponse(String json) { CartInfo cartInfo = new Gson().fromJson(json, CartInfo.class); if ("0".equals(cartInfo.getCode())){ List<CartInfo.DataBean> data = cartInfo.getData(); adapter = new MyAdapter(data); el_cart.setAdapter(adapter); //展开二级列表 for(int x=0; x<data.size(); x++){ el_cart.expandGroup(x); } adapter.setOnCartListChangeListener(new MyAdapter.onCartListChangeListener() { @Override public void onSellerCheckedChange(int i) { //商家被点击 boolean currentSellerAllProductSelected = adapter.isCurrentSellerAllProductSelected(i); adapter.changeCurrentSellerAllProductsStatus(i, !currentSellerAllProductSelected); adapter.notifyDataSetChanged(); //B.刷新底部数据 refreshSelectedAndTotalPriceAndTotalNumber(); } @Override public void onProductCheckedChange(int i, int i1) { //点击商品得checkbox adapter.changeCurrentProductStatus(i,i1); adapter.notifyDataSetChanged(); //B.刷新底部数据 refreshSelectedAndTotalPriceAndTotalNumber(); } @Override public void onProducNumberChange(int i, int i1, int number) { //当加减被点击 adapter.changeCurrentProductNumber(i,i1,number); adapter.notifyDataSetChanged(); //B.刷新底部数据 refreshSelectedAndTotalPriceAndTotalNumber(); } }); } } }); } //B.刷新checkbox状态和总价和总数量 private void refreshSelectedAndTotalPriceAndTotalNumber() { //去判断是否所有得商品都被选中 boolean allProductsSelected = adapter.isAllProductsSelected(); //设置给全选checkBox cb_cart_all_select.setChecked(allProductsSelected); //计算总价 float totalPrice = adapter.calculateTotalPrice(); tv_cart_total_price.setText("总价 " + totalPrice); //计算总数量 int totalNumber = adapter.calculateTotalNumber(); btn_cart_pay.setText("去结算(" + totalNumber + ")"); } //初始化的操作 private void initView() { el_cart = (ExpandableListView) findViewById(R.id.el_cart); cb_cart_all_select = (CheckBox) findViewById(R.id.cb_cart_all_select); tv_cart_total_price = (TextView) findViewById(R.id.tv_cart_total_price); btn_cart_pay = (Button) findViewById(R.id.btn_cart_pay); cb_cart_all_select.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.cb_cart_all_select: //底部全选按钮 //时候所有得商品都被选中 boolean allProductsSelected = adapter.isAllProductsSelected(); adapter.changeAllProductStatus(!allProductsSelected); adapter.notifyDataSetChanged(); //刷新底部数据 refreshSelectedAndTotalPriceAndTotalNumber(); break; } } }
MyAdapter.java
public class MyAdapter extends BaseExpandableListAdapter{ private List<CartInfo.DataBean> list; public MyAdapter(List<CartInfo.DataBean> data) { list=data; } @Override public int getGroupCount() { return list==null ? 0 : list.size(); } @Override public int getChildrenCount(int i) { return list.get(i).getList()==null ? 0 :list.get(i).getList().size(); } @Override public View getGroupView(final int i, boolean b, View view, ViewGroup viewGroup) { //先拿到Bean里组的数据,看hiJson CartInfo.DataBean dataBean = list.get(i); ParentViewHolder parentViewHolder; if (view == null) { view = View.inflate(viewGroup.getContext(), R.layout.item_cart_parent, null); parentViewHolder = new ParentViewHolder(view); view.setTag(parentViewHolder); } else { parentViewHolder = (ParentViewHolder) view.getTag(); } parentViewHolder.seller_name_tv.setText(dataBean.getSellerName()); boolean currentSellerAllProductSelected = isCurrentSellerAllProductSelected(i); parentViewHolder.seller_cb.setChecked(currentSellerAllProductSelected); //D.设置点击CheckBox parentViewHolder.seller_cb.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnCartListChangeListener !=null){ mOnCartListChangeListener.onSellerCheckedChange(i); } } }); return view; } @Override public View getChildView(final int i, final int i1, boolean b, View view, ViewGroup viewGroup) { CartInfo.DataBean dataBean = list.get(i); List<CartInfo.DataBean.ListBean> list1 = dataBean.getList(); CartInfo.DataBean.ListBean listBean = list1.get(i1); ChildViewHolder childViewHolder; if (view == null) { view = View.inflate(viewGroup.getContext(), R.layout.item_cart_child, null); childViewHolder = new ChildViewHolder(view); view.setTag(childViewHolder); } else { childViewHolder=(ChildViewHolder)view.getTag(); } //设置商品名字 childViewHolder.product_title_name_tv.setText(listBean.getTitle()); //设置商品单价 childViewHolder.product_price_tv.setText(listBean.getPrice()+""); //设置复选框是否选中 childViewHolder.child_cb.setChecked(listBean.getSelected() == 1); //设置组合式自定义控件内部的数量 childViewHolder.add_remove_view.setNumber(listBean.getNum()); //D.设置商品CheckBox的点击事件,通过接口回调,暴露给外面 childViewHolder.child_cb.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnCartListChangeListener != null){ mOnCartListChangeListener.onProductCheckedChange(i,i1); } } }); //D.设置商品数量的点击事件,通过接口回调,暴露给外面 childViewHolder.add_remove_view.setOnNumberChangeListener(new AddSubView.OnNumberChangeListener() { @Override public void onNumberChange(int num) { if (mOnCartListChangeListener !=null){ mOnCartListChangeListener.onProducNumberChange(i,i1,num); } } }); return view; } public boolean isCurrentSellerAllProductSelected(int i){//根据商品改变商家--如果商品全部选中商家则选中--有一个商品没选中则商家不选中 CartInfo.DataBean dataBean = list.get(i); List<CartInfo.DataBean.ListBean> beans = dataBean.getList(); for (CartInfo.DataBean.ListBean bean : beans){ if (bean.getSelected()==0){ return false; } } return true; } public boolean isAllProductsSelected(){ //根据商品改变全选--如果商品全部选中全选则选中--有一个商品没选中则全选不选中 for (int x=0;x<list.size();x++){ CartInfo.DataBean dataBean = list.get(x); List<CartInfo.DataBean.ListBean> list1 = dataBean.getList(); for (int j=0;j<list1.size();j++){ if (list1.get(j).getSelected()==0){ return false; } } } return true; } public int calculateTotalNumber(){ //计算总数量 int totalNumber=0; for (int i=0;i<list.size();i++){ CartInfo.DataBean dataBean = list.get(i); List<CartInfo.DataBean.ListBean> list1 = dataBean.getList(); for (int j=0;j<list1.size();j++){ if (list1.get(j).getSelected()==1){ int num = list1.get(j).getNum(); totalNumber+=num; } } } return totalNumber; } public float calculateTotalPrice(){ //获取总价 float totalPrice=0; for (int i=0;i<list.size();i++){ CartInfo.DataBean dataBean = list.get(i); List<CartInfo.DataBean.ListBean> list = dataBean.getList(); for (int j=0;j<list.size();j++){ if (list.get(j).getSelected()==1){ float price = list.get(j).getPrice(); int num = list.get(j).getNum(); totalPrice+=price*num; } } } return totalPrice; } //C.当商品组的全选框点击时,更新所有商品的状态 public void changeCurrentSellerAllProductsStatus(int i,boolean isSelected){ CartInfo.DataBean dataBean = list.get(i); List<CartInfo.DataBean.ListBean> beans = dataBean.getList(); for (int j=0;j<beans.size();j++){ CartInfo.DataBean.ListBean bean = beans.get(j); bean.setSelected(isSelected ?1 :0); } } //C.当商家子条目的全选框选中时,更新其状态 public void changeCurrentProductStatus(int i , int i1){ CartInfo.DataBean dataBean = list.get(i); List<CartInfo.DataBean.ListBean> list = dataBean.getList(); CartInfo.DataBean.ListBean listBean = list.get(i1); listBean.setSelected(listBean.getSelected() == 0 ? 1 : 0 ); } //C.设置所有商品的状态 public void changeAllProductStatus(boolean selected){ for(int x=0; x<list.size() ; x++){ CartInfo.DataBean dataBean = list.get(x); List<CartInfo.DataBean.ListBean> list = dataBean.getList(); for(int j=0; j<list.size(); j++){ list.get(j).setSelected(selected ? 1 : 0); } } } //C.当加减器被点击时,调用,改变里面当前商品的数量 参数1定位那个商家 参数2定位哪个商品 参数3定位改变具体的数量是多少 public void changeCurrentProductNumber(int i,int i1,int number){ CartInfo.DataBean dataBean = list.get(i); List<CartInfo.DataBean.ListBean> list = dataBean.getList(); CartInfo.DataBean.ListBean listBean = list.get(i1); listBean.setNum(number); } public interface onCartListChangeListener{ /** * 当商家的checkBox点击时回调 */ void onSellerCheckedChange(int i); /** * 当点击子条目商品的CheckBox回调 */ void onProductCheckedChange(int i ,int i1); /** * 当点击加减按钮的回调 */ void onProducNumberChange(int i , int i1 , int number); } //D. onCartListChangeListener mOnCartListChangeListener; //D. public void setOnCartListChangeListener(onCartListChangeListener onCartListChangeListener){ mOnCartListChangeListener = onCartListChangeListener ; } public static class ParentViewHolder { public CheckBox seller_cb; public TextView seller_name_tv; public ParentViewHolder(View rootView) { this.seller_cb = (CheckBox) rootView.findViewById(R.id.seller_cb); this.seller_name_tv = (TextView) rootView.findViewById(R.id.seller_name_tv); } } public static class ChildViewHolder { public CheckBox child_cb; public ImageView product_icon_iv; public TextView product_title_name_tv; public TextView product_price_tv; public AddSubView add_remove_view; public ChildViewHolder(View rootView) { this.child_cb = (CheckBox) rootView.findViewById(R.id.child_cb); this.product_icon_iv = (ImageView) rootView.findViewById(R.id.product_icon_iv); this.product_title_name_tv = (TextView) rootView.findViewById(R.id.product_title_name_tv); this.product_price_tv = (TextView) rootView.findViewById(R.id.product_price_tv); this.add_remove_view = (AddSubView) rootView.findViewById(R.id.add_remove_view); } } @Override public Object getGroup(int i) { return null; } @Override public Object getChild(int i, int i1) { return null; } @Override public long getGroupId(int i) { return 0; } @Override public long getChildId(int i, int i1) { return 0; } @Override public boolean hasStableIds() { return false; } @Override public boolean isChildSelectable(int i, int i1) { return false; } }
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ExpandableListView android:id="@+id/el_cart" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="60dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="60dp" android:layout_alignParentBottom="true" android:background="#eeeeee" android:gravity="center_vertical"> <CheckBox android:id="@+id/cb_cart_all_select" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="全选" /> <TextView android:id="@+id/tv_cart_total_price" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:paddingLeft="20dp" android:text="合计:¥0.00" /> <Button android:id="@+id/btn_cart_pay" android:layout_width="100dp" android:layout_height="match_parent" android:text="去结算(0)" /> </LinearLayout> </RelativeLayout>
AddSubView.java
public class AddSubView extends LinearLayout implements View.OnClickListener{ //组合式控件 private int number = 1; private TextView sub_tv; private TextView product_number_tv; private TextView add_tv; public AddSubView(Context context) { this(context,null); } public AddSubView(Context context, @Nullable AttributeSet attrs) { this(context, attrs,0); } public AddSubView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); View view = inflate(context, R.layout.add_remove, this); sub_tv=view.findViewById(R.id.sub_tv); product_number_tv=view.findViewById(R.id.product_number_tv); add_tv=view.findViewById(R.id.add_tv); sub_tv.setOnClickListener(this); add_tv.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.sub_tv: if (number>1){ --number; product_number_tv.setText(number+""); if (onNumberChangeListener!=null){ onNumberChangeListener.onNumberChange(number); } }else { Toast.makeText(getContext(), "不能再少了", Toast.LENGTH_SHORT).show(); } break; case R.id.add_tv: if (number<8){ ++number; product_number_tv.setText(number+""); if (onNumberChangeListener!=null){ onNumberChangeListener.onNumberChange(number); } }else { Toast.makeText(getContext(), "不能再多了", Toast.LENGTH_SHORT).show(); } break; } } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; product_number_tv.setText(number + ""); } OnNumberChangeListener onNumberChangeListener; public void setOnNumberChangeListener(OnNumberChangeListener onNumberChangeListener) { this.onNumberChangeListener = onNumberChangeListener; } interface OnNumberChangeListener { void onNumberChange(int num); } }
add_remove.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:padding="2dp" android:layout_marginLeft="10dp" android:layout_width="60dp" android:layout_height="30dp" android:layout_gravity="center_vertical" android:background="#99000000" android:gravity="center_vertical"> <TextView android:background="#ffffff" android:layout_weight="1" android:id="@+id/sub_tv" android:layout_width="0dp" android:layout_height="match_parent" android:gravity="center" android:text="-" android:textSize="16sp" /> <TextView android:text="1" android:layout_marginLeft="2dp" android:background="#ffffff" android:layout_weight="1" android:id="@+id/product_number_tv" android:layout_width="0dp" android:layout_height="match_parent" android:gravity="center" /> <TextView android:layout_marginLeft="2dp" android:background="#ffffff" android:layout_weight="1" android:id="@+id/add_tv" android:layout_width="0dp" android:layout_height="match_parent" android:gravity="center" android:text="+" android:textSize="16sp" /> </LinearLayout>
item_cart_parent.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" //商家条目 android:layout_width="match_parent" android:layout_height="60dp" android:gravity="center_vertical" > <CheckBox android:id="@+id/seller_cb" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/seller_name_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" /> </LinearLayout>
item_cart_child.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="120dp" android:gravity="center_vertical"> <CheckBox android:id="@+id/child_cb" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:id="@+id/product_icon_iv" android:layout_width="80dp" android:layout_height="80dp" android:layout_marginLeft="20dp" android:scaleType="centerCrop" android:src="@color/colorPrimary" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical"> <TextView android:id="@+id/product_title_name_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="end" android:maxLines="2" android:text="商品标题" /> <TextView android:id="@+id/product_price_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="¥0.0" /> </LinearLayout> <fanruiqi.bwie.com.shopcat.AddSubView android:id="@+id/add_remove_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="10dp" /> </LinearLayout>
OkHttpUtils.java
public class OkhtttpUtils { private static OkhtttpUtils mOkhtttpUtils; private OkHttpClient mOkHttpClien; private final Handler mHandler; private OkhtttpUtils() { //创建一个主线程的handler mHandler = new Handler(Looper.getMainLooper()); mOkHttpClien = new OkHttpClient.Builder() .connectTimeout(5000, TimeUnit.MILLISECONDS) .readTimeout(5000, TimeUnit.MILLISECONDS) .writeTimeout(5000, TimeUnit.MILLISECONDS) .build(); } //单例模式 public static OkhtttpUtils getInstance() { if (mOkhtttpUtils == null) { synchronized (OkhtttpUtils.class) { if (mOkhtttpUtils == null) { return mOkhtttpUtils = new OkhtttpUtils(); } } } return mOkhtttpUtils; } public interface OkCallback { void onFailure(Exception e); void onResponse(String json); } public void doPost(String url, Map<String, String> map, final OkCallback okCallback) { //创建FormBody的对象,把表单添加到formBody中 FormBody.Builder builder = new FormBody.Builder(); if (map != null) { for (String key : map.keySet()) { builder.add(key, map.get(key)); } } FormBody formBody = builder.build(); //创建Request对象 Request request = new Request.Builder() .post(formBody) .url(url) .build(); //创建Call对象 final Call call = mOkHttpClien.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { if (okCallback != null) { //切换到主线程 mHandler.post(new Runnable() { @Override public void run() { okCallback.onFailure(e); } }); } } @Override public void onResponse(Call call, final Response response) throws IOException { try { if (response != null && response.isSuccessful()) { final String json = response.body().string(); mHandler.post(new Runnable() { @Override public void run() { if (okCallback != null) { okCallback.onResponse(json); return; } } }); } } catch (IOException e) { e.printStackTrace(); } if (okCallback != null) { okCallback.onFailure(new Exception("网络异常")); } } }); } //封装doGet的网络请求 public void doGet(String url, final OkCallback okCallback) { Request request = new Request.Builder() .get() .url(url) .build(); final Call call = mOkHttpClien.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { if (okCallback != null) { //切换到主线程 mHandler.post(new Runnable() { @Override public void run() { okCallback.onFailure(e); } }); } } @Override public void onResponse(Call call, final Response response) throws IOException { try { if (response != null && response.isSuccessful()) { final String json = response.body().string(); mHandler.post(new Runnable() { @Override public void run() { if (okCallback != null) { okCallback.onResponse(json); return; } } }); } } catch (IOException e) { e.printStackTrace(); } } }); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍详解Android实现购物车页面及购物车效果(点击动画),包括了详解Android实现购物车页面及购物车效果(点击动画)的使用技巧和注意事项,需要的朋友参考一下 本文介绍了Android实现购物车页面及购物车效果(点击动画),分享给大家,具体如下: 效果图如下: 思路: (1)思考每个条目中的数字的更新原理。 (2)购物车的动画效果。 (3)购物清单怎么显示(这个我暂时没有写,如果需
本文向大家介绍Vue实现购物车详情页面的方法,包括了Vue实现购物车详情页面的方法的使用技巧和注意事项,需要的朋友参考一下 上次我们为商品分类菜单添加了显示购物数量,这篇我们继续推进项目,来实现购物车的详情页面,在开始之前我们先看它在页面中的样子: 如上所示,此页面包含了购物列表,而它由商品名称,单价,增减商品功能构成,增减商品功能我们在商品列表中实现过,那么我们现在可以进行复用。 搭出购物车
本文向大家介绍Android实现购物车功能,包括了Android实现购物车功能的使用技巧和注意事项,需要的朋友参考一下 最近看了一些淘宝购物车的demo,于是也写了一个。 效果图如下: 主要代码如下: actvity中的代码: actvity中XML的代码: -XML中头部可以到网上找一个这里就不放上来了 .checkbox和button的样式可以根据个人喜好设置。 Adaper中的代码: Ada
本文向大家介绍ASP.NET购物车实现过程详解,包括了ASP.NET购物车实现过程详解的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了ASP.NET实现购物车的具体代码,供大家参考,具体内容如下 1、 将test数据库附加到数据库管理系统中;数据库中的book_info包含下列数据: 2、 新建一个网站,将images文件夹复制到网站中; 3、 在Default.aspx中,通过Da
本文向大家介绍Vue.js实现的购物车功能详解,包括了Vue.js实现的购物车功能详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Vue.js实现的购物车功能。分享给大家供大家参考,具体如下: 使用计算属性,内置指令,方法等基础知识开发购物车。 需求分析:展示一个已经加入购物车的商品列表,包含商品名称、商品单价、购买数量和操作,以及最后确定是否选中商品的功能,总价格为选中商品的价格,够
本文向大家介绍Python实现购物车购物小程序,包括了Python实现购物车购物小程序的使用技巧和注意事项,需要的朋友参考一下 概要 按理说,我们入门的第一个小程序都应该是Hello World。因为比较简单,我这也就不做过多的演示 了。 下面是我写的一个小程序。主要用于练习Python的基本语法,以及入门。 主要实现功能 要求用户输入自己预期消费额度. 展示现有商品信息,要求用户选择 用户选择对