您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
本文为大家讲解了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(); } } }); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持亿速云。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。