Android 购物车相关(全选/反选、删除、网络数据)

来源:互联网 发布:如何在淘宝上买发票啊 编辑:程序博客网 时间:2024/06/08 20:01

今天 给大家展示 购物车 的效果 及布局展示 :
导入 依赖

    compile 'com.android.support:appcompat-v7:25.3.1'    compile 'com.android.support.constraint:constraint-layout:1.0.2'    compile 'com.android.support:recyclerview-v7:25.3.1'    compile 'com.facebook.fresco:fresco:0.11.0'    compile 'com.squareup.retrofit2:retrofit:2.0.2'    compile 'com.squareup.retrofit2:converter-gson:2.0.2'

通过 retrofit 请求网络数据 ,我们定义了 一个 application :

application类

import android.app.Application;import com.facebook.drawee.backends.pipeline.Fresco;import com.king.shop.IDataService;import retrofit2.Retrofit;import retrofit2.converter.gson.GsonConverterFactory;/** * application类 */public class IApplication extends Application{    public static IDataService service;    @Override    public void onCreate() {        super.onCreate();        //初始化 Fresco        Fresco.initialize(this);        //初始化 Retrofit        Retrofit retrofit = new Retrofit.Builder()                .baseUrl("https://www.zhaoapi.cn/")                .addConverterFactory(GsonConverterFactory.create())                .build();        service = retrofit.create(IDataService.class);    }}

在里面 初始化 的retrofit 以及 fresco 图片加载框架;

接下来展示 的是 retrofit 拼接接口的类:

import com.king.shop.bean.CarBean;import com.king.shop.bean.DelBean;import com.king.shop.bean.UpDataBean;import retrofit2.Call;import retrofit2.http.GET;import retrofit2.http.Query;/** *  retrofit 拼接 接口类 */public interface IDataService {    //获取购物车列表的接口    @GET("product/getCarts")    Call<CarBean> getCar(@Query("uid") String uid, @Query("source") String source);    //删除商品 的接口    @GET("product/deleteCart")    Call<DelBean> delCar(@Query("uid") String uid, @Query("pid") String pid, @Query("source") String source);}

自定义 加减器 :

import android.content.Context;import android.support.annotation.Nullable;import android.util.AttributeSet;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.LinearLayout;import android.widget.Toast;import com.king.shop.R;/** * 自定义 加减器 */public class MyCustomCar extends LinearLayout{    private Button mBtnDel;    private EditText mEtNum;    private Button mBtnAdd;    private int mCount = 1;    public MyCustomCar(Context context) {        super(context);    }    public MyCustomCar(Context context, @Nullable AttributeSet attrs) {        super(context, attrs);        View view = View.inflate(context, R.layout.custom_item, null);        mBtnDel = (Button) view.findViewById(R.id.btnDel);        mEtNum = (EditText) view.findViewById(R.id.etNum);        mBtnAdd = (Button) view.findViewById(R.id.btnAdd);        //减少点击事件        mBtnDel.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                String content = mEtNum.getText().toString().trim();                int count = Integer.valueOf(content);                if (count > 1){                    mCount = count - 1 ;                    mEtNum.setText(""+mCount+"");                    if (customListener != null){                        customListener.del(mCount);                    }                }else{                    Toast.makeText(getContext(), "不能再少了", Toast.LENGTH_SHORT).show();                }            }        });        //增加点击事件        mBtnAdd.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                String content = mEtNum.getText().toString().trim();                int count = Integer.valueOf(content);                mCount = count + 1;                mEtNum.setText(""+mCount+"");                if (customListener != null){                    customListener.add(mCount);                }            }        });        addView(view);    }    public MyCustomCar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    //接口回调    private CustomListener customListener;    public void setCustomListener(CustomListener customListener) {        this.customListener = customListener;    }    public interface CustomListener{        void add(int count);        void del(int count);    }    public void setEditText(int num){            mEtNum.setText(""+num+"");    }}

通过 MVP 框架:

model:

import com.king.shop.bean.CarBean;/** * 购物车列表的 model 接口层 */public interface ICarModel {    void success(CarBean bean);}
mport com.king.shop.app.IApplication;import com.king.shop.bean.CarBean;import retrofit2.Call;import retrofit2.Callback;import retrofit2.Response;/** *  购物车展示列表的 model 层 */public class CarModel {    public void getData(final ICarModel iCarModel){        //通过  retrofit 请求数据        Call<CarBean> call = IApplication.service.getCar("205", "android");        call.enqueue(new Callback<CarBean>() {            @Override            public void onResponse(Call<CarBean> call, Response<CarBean> response) {                iCarModel.success(response.body()   );            }            @Override            public void onFailure(Call<CarBean> call, Throwable t) {            }        });    }}

view 层:

import com.king.shop.bean.CarBean;/** * 购物车列表的 view 层 */public interface ICarView {    void success(CarBean bean);}

presenter 层:

import com.king.shop.bean.CarBean;import com.king.shop.model.CarModel;import com.king.shop.model.ICarModel;import com.king.shop.view.ICarView;/** *  购物车列表的 presenter 层 */public class CarPresenter {    private ICarView iCarView;    private CarModel carModel;    public CarPresenter(ICarView iCarView) {        this.iCarView = iCarView;        carModel = new CarModel();    }    public void getData(){        carModel.getData(new ICarModel() {            @Override            public void success(CarBean bean) {                iCarView.success(bean);            }        });    }}

mainActivity 类:

import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;import android.widget.Button;import android.widget.CheckBox;import android.widget.TextView;import com.king.shop.adapter.CarAdapter;import com.king.shop.bean.CarBean;import com.king.shop.presenter.CarPresenter;import com.king.shop.view.ICarView;/** *  购物车 展示 */public class MainActivity extends AppCompatActivity implements ICarView, View.OnClickListener {    private CarPresenter presenter;    private TextView mTvTotalNum;//    private TextView mTvEdit;    private RecyclerView mRecyclerView;    private CheckBox mCheckAll;    private TextView mTvTotalPrice;    private Button mBtnBuy;    private CarAdapter adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        //实例化 presenter        presenter = new CarPresenter(this);        //调用 presenter 的方法  请求购物车 的数据        presenter.getData();        //全选 标签  默认是 1        mCheckAll.setTag(1);        //加载布局管理器        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));        //实例化 适配器        adapter = new CarAdapter(this);        //加载适配器        mRecyclerView.setAdapter(adapter);        // 通过 接口回调 获取适配器得到的 总数量 与 总价格        adapter.setUpDataListener(new CarAdapter.UpDataListener() {            @Override            public void setTotal(String price, String num, boolean isCheck) {                mTvTotalNum.setText("购物车("+num+")");                mTvTotalPrice.setText("¥"+price);                //设置 全选的 标签                if (isCheck){                    mCheckAll.setTag(2);                }else{                    mCheckAll.setTag(1);                }                mCheckAll.setChecked(isCheck);            }        });        //全选        mCheckAll.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                int tag = (int) mCheckAll.getTag();                if (tag == 1){                    mCheckAll.setTag(2);                }else{                    mCheckAll.setTag(1);                }                //调用 适配器的全选的方法                adapter.allCheck(mCheckAll.isChecked());            }        });    }    private void initView() {        mTvTotalNum = (TextView) findViewById(R.id.tvTotalNum);//        mTvEdit = (TextView) findViewById(R.id.tvEdit);        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);        mCheckAll = (CheckBox) findViewById(R.id.checkAll);        mTvTotalPrice = (TextView) findViewById(R.id.tvTotalPrice);        mBtnBuy = (Button) findViewById(R.id.btnBuy);        mBtnBuy.setOnClickListener(this);    }    @Override    public void success(CarBean bean) {        //调用 适配器中的 add 方法        adapter.add(bean);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.btnBuy:                // TODO 17/12/19                break;            default:                break;        }    }}

adapter 类:

import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.CheckBox;import android.widget.LinearLayout;import android.widget.TextView;import android.widget.Toast;import com.facebook.drawee.view.SimpleDraweeView;import com.king.shop.R;import com.king.shop.app.IApplication;import com.king.shop.bean.CarBean;import com.king.shop.bean.DelBean;import com.king.shop.custom.MyCustomCar;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import retrofit2.Call;import retrofit2.Callback;import retrofit2.Response;/** * 购物车 适配器 */public class CarAdapter extends RecyclerView.Adapter<CarAdapter.MyViewHolder>{    private Context context;    private int mCount = 1;    List<CarBean.DataBean.ListBean> list;    private HashMap<String, String> hashMap = new HashMap<>();    public CarAdapter(Context context) {        this.context = context;    }    public void add(CarBean bean) {        if (list == null) {            list = new ArrayList<>();        }        //遍历商铺的集合        for (CarBean.DataBean b :bean.getData()) {            //将 对应的 店铺号  与 店铺名  存入 map集合            hashMap.put(b.getSellerid(),b.getSellerName());            //遍历商铺   ,将 商品  添加进入集合            for (int i = 0; i < b.getList().size(); i++) {                list.add(b.getList().get(i));            }        }        setFirst(list);        //刷新适配器        notifyDataSetChanged();    }    /**     * 设置是否显示 店铺名     * 1 为显示     * 2 为不显示     */    public void setFirst(List<CarBean.DataBean.ListBean> list){        if (list.size() > 0){            //第一条商品一定 显示 商铺名            list.get(0).setIsFirst(1);            //从第二条开始遍历            for (int i = 1; i < list.size(); i++) {                //从第二条开始  ,如果商铺的 id 与上一个 id 一样时,设置商铺名为隐藏                if (list.get(i).getSellerid() == list.get(i-1).getSellerid()){                    list.get(i).setIsFirst(2);                }else{                    list.get(i).setIsFirst(1);                    //如果商铺的 商品 仅有一件商品 且被选中 那么商铺也将被选中                    if (list.get(i).isGood_check() == true){                        list.get(i).setShop_check(list.get(i).isGood_check());                    }                }            }        }    }    @Override    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View inflate = View.inflate(context, R.layout.car_item, null);        MyViewHolder holder = new MyViewHolder(inflate);        return holder;    }    @Override    public void onBindViewHolder(final MyViewHolder holder, final int position) {        //如果 isFirst 属性为1的话,展示        if (list.get(position).getIsFirst() == 1){            holder.mTvShopName.setVisibility(View.VISIBLE);            holder.mCheckShop.setVisibility(View.VISIBLE);            holder.mCheckShop.setChecked(list.get(position).isShop_check());            holder.mTvShopName.setText(hashMap.get(String.valueOf(list.get(position).getSellerid())));        }else{            holder.mCheckShop.setVisibility(View.GONE);            holder.mTvShopName.setVisibility(View.GONE);        }        holder.mSimple.setImageURI(list.get(position).getImages().split("\\|")[0]);        holder.mCheckGood.setChecked(list.get(position).isGood_check());        holder.mTvGoodName.setText(list.get(position).getTitle());        holder.mTvPrice.setText("¥"+list.get(position).getPrice()+"");        holder.mTvNum.setText("X"+list.get(position).getNum());        //商铺 CheckBox 的点击事件        holder.mCheckShop.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                list.get(position).setShop_check(holder.mCheckShop.isChecked());                for (int i = 0; i < list.size(); i++) {                    if (list.get(i).getSellerid() == list.get(position).getSellerid()){                        list.get(i).setGood_check(holder.mCheckShop.isChecked());                    }                }                notifyDataSetChanged();                sum(list);            }        });        //商品 CheckBox 的点击事件        holder.mCheckGood.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //根据CheckBox的状态 改变属性                list.get(position).setGood_check(holder.mCheckGood.isChecked());                for (int i = 0; i < list.size(); i++) {                    for (int j = 0; j < list.size(); j++) {                        if (list.get(i).getSellerid() == list.get(j).getSellerid() && !list.get(j).isGood_check()){                            list.get(i).setShop_check(false);                            break;                        }else{                            list.get(i).setShop_check(true);                        }                    }                }                notifyDataSetChanged();                sum(list);            }        });        /**         * 点击商品条目上的编辑         */        holder.mTvEdit.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //点击条目上的编辑变化布局 与 文字                if (holder.mTvEdit.getText().toString().equals("完成")){                    holder.mTvEdit.setText("编辑");                    holder.mLlOne.setVisibility(View.VISIBLE);                    holder.mLlTwo.setVisibility(View.GONE);                }else{                    holder.mTvEdit.setText("完成");                    holder.mLlOne.setVisibility(View.GONE);                    holder.mLlTwo.setVisibility(View.VISIBLE);                }                //点击 删除 按钮                holder.mBtnDel.setOnClickListener(new View.OnClickListener() {                    @Override                    public void onClick(View v) {                        //调用 删除的 接口                        IApplication.service.delCar("205",list.get(position).getPid()+"","android")                                .enqueue(new Callback<DelBean>() {                                    @Override                                    public void onResponse(Call<DelBean> call, Response<DelBean> response) {                                        DelBean body = response.body();                                        //在布局上删除条目,刷新适配器                                        list.remove(position);                                        notifyDataSetChanged();                                        Toast.makeText(context, body.getMsg(), Toast.LENGTH_SHORT).show();                                    }                                    @Override                                    public void onFailure(Call<DelBean> call, Throwable t) {                                    }                                });                    }                });                //给加减器的商品个数赋值                holder.mMyCustomCar.setEditText(list.get(position).getNum());                //加减器的接口回调                holder.mMyCustomCar.setCustomListener(new MyCustomCar.CustomListener() {                    //添加                    @Override                    public void add(int count) {                        holder.mTvNum.setText(""+count+"");                        mCount = count;                        notifyDataSetChanged();                        sum(list);                    }                    //减少                    @Override                    public void del(int count) {                        holder.mTvNum.setText(""+count+"");                        notifyDataSetChanged();                        sum(list);                    }                });            }        });    }    //全选    public void allCheck(boolean isCheck){        // 如果 全选按钮被选中,商铺与商品也被选中        for (int i = 0; i < list.size(); i++) {            list.get(i).setShop_check(isCheck);            list.get(i).setGood_check(isCheck);        }        notifyDataSetChanged();        sum(list);    }    //计算 总数量 与 总价格    public void sum(List<CarBean.DataBean.ListBean> list){        int totalNum = 0;        float totalPrice = 0.0f;        boolean allCheck = true;        //遍历商品的集合        for (int i = 0; i < list.size(); i++) {            //如果商品的CheckBox选中,计算被选中的商品数量与价钱            if (list.get(i).isGood_check()){                totalNum += list.get(i).getNum();                totalPrice += list.get(i).getPrice() * list.get(i).getNum();            }else {                allCheck = false;            }        }        //将 总数量 与总价钱 通过接头回调传到activity        upDataListener.setTotal(totalPrice+"",totalNum+"",allCheck);    }    @Override    public int getItemCount() {        return list == null ? 0 :list.size();    }    public class MyViewHolder extends RecyclerView.ViewHolder {        private CheckBox mCheckShop;        private TextView mTvShopName;        private TextView mTvEdit;        private CheckBox mCheckGood;        private SimpleDraweeView mSimple;        private TextView mTvGoodName;        private TextView mTvPrice;        private TextView mTvNum;        private LinearLayout mLlOne;        private MyCustomCar mMyCustomCar;        private Button mBtnDel;        private LinearLayout mLlTwo;        public MyViewHolder(View itemView) {            super(itemView);            mCheckShop = (CheckBox) itemView.findViewById(R.id.checkShop);            mTvShopName = (TextView) itemView.findViewById(R.id.tvShopName);            mTvEdit = (TextView) itemView.findViewById(R.id.tvEdit);            mCheckGood = (CheckBox) itemView.findViewById(R.id.checkGood);            mSimple = (SimpleDraweeView) itemView.findViewById(R.id.simple);            mTvGoodName = (TextView) itemView.findViewById(R.id.tvGoodName);            mTvPrice = (TextView) itemView.findViewById(R.id.tvPrice);            mTvNum = (TextView) itemView.findViewById(R.id.tvNum);            mLlOne = (LinearLayout) itemView.findViewById(R.id.llOne);            mMyCustomCar = (MyCustomCar) itemView.findViewById(R.id.myCustomCar);            mBtnDel = (Button) itemView.findViewById(R.id.btnDels);            mLlTwo = (LinearLayout) itemView.findViewById(R.id.llTwo);        }    }    //计算总价与总数量的接口回调    private  UpDataListener upDataListener;    public void setUpDataListener(UpDataListener upDataListener) {        this.upDataListener = upDataListener;    }    public interface UpDataListener{        void setTotal(String price,String num,boolean isCheck);    }}

两个 bean 类:

mport java.util.List;/** * 购物车 列表 bean * * 向 商品 的list 中 添加 三个属性 * private int isFirst ; * private boolean good_check; * private boolean shop_check; * */public class CarBean {    private String msg;    private String code;    private List<DataBean> data;    public String getMsg() {        return msg;    }    public void setMsg(String msg) {        this.msg = msg;    }    public String getCode() {        return code;    }    public void setCode(String code) {        this.code = code;    }    public List<DataBean> getData() {        return data;    }    public void setData(List<DataBean> data) {        this.data = data;    }    public static class DataBean {        private String sellerName;        private String sellerid;        private List<ListBean> list;        public String getSellerName() {            return sellerName;        }        public void setSellerName(String sellerName) {            this.sellerName = sellerName;        }        public String getSellerid() {            return sellerid;        }        public void setSellerid(String sellerid) {            this.sellerid = sellerid;        }        public List<ListBean> getList() {            return list;        }        public void setList(List<ListBean> list) {            this.list = list;        }        public static class ListBean {            private double bargainPrice;            private String createtime;            private String detailUrl;            private String images;            private int num;            private int pid;            private double price;            private int pscid;            private int selected;            private int sellerid;            private String subhead;            private String title;            /**             *定义三个              */            private int isFirst ;            private boolean good_check;            private boolean shop_check;            public int getIsFirst() {                return isFirst;            }            public void setIsFirst(int isFirst) {                this.isFirst = isFirst;            }            public boolean isGood_check() {                return good_check;            }            public void setGood_check(boolean good_check) {                this.good_check = good_check;            }            public boolean isShop_check() {                return shop_check;            }            public void setShop_check(boolean shop_check) {                this.shop_check = shop_check;            }            public double getBargainPrice() {                return bargainPrice;            }            public void setBargainPrice(double bargainPrice) {                this.bargainPrice = bargainPrice;            }            public String getCreatetime() {                return createtime;            }            public void setCreatetime(String createtime) {                this.createtime = createtime;            }            public String getDetailUrl() {                return detailUrl;            }            public void setDetailUrl(String detailUrl) {                this.detailUrl = detailUrl;            }            public String getImages() {                return images;            }            public void setImages(String images) {                this.images = images;            }            public int getNum() {                return num;            }            public void setNum(int num) {                this.num = num;            }            public int getPid() {                return pid;            }            public void setPid(int pid) {                this.pid = pid;            }            public double getPrice() {                return price;            }            public void setPrice(double price) {                this.price = price;            }            public int getPscid() {                return pscid;            }            public void setPscid(int pscid) {                this.pscid = pscid;            }            public int getSelected() {                return selected;            }            public void setSelected(int selected) {                this.selected = selected;            }            public int getSellerid() {                return sellerid;            }            public void setSellerid(int sellerid) {                this.sellerid = sellerid;            }            public String getSubhead() {                return subhead;            }            public void setSubhead(String subhead) {                this.subhead = subhead;            }            public String getTitle() {                return title;            }            public void setTitle(String title) {                this.title = title;            }        }    }}
/** * 购物车 删除 bean */public class DelBean {    /**     * msg : 删除购物车成功     * code : 0     */    private String msg;    private String code;    public String getMsg() {        return msg;    }    public void setMsg(String msg) {        this.msg = msg;    }    public String getCode() {        return code;    }    public void setCode(String code) {        this.code = code;    }}

布局:

mainactivity 布局

<?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.king.shop.MainActivity">    <RelativeLayout        android:layout_width="match_parent"        android:layout_height="50dp"        android:padding="10dp">        <TextView            android:id="@+id/tvTotalNum"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:text="购物车(0)"            android:textSize="20sp" />        <TextView            android:id="@+id/tvEdit"            android:layout_width="wrap_content"            android:layout_height="match_parent"            android:layout_alignParentRight="true"            android:gravity="center_vertical"            android:text="编辑" />    </RelativeLayout>    <android.support.v7.widget.RecyclerView        android:id="@+id/recyclerView"        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1"/>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal">        <CheckBox            android:id="@+id/checkAll"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="全选" />        <RelativeLayout            android:layout_width="0dp"            android:layout_height="match_parent"            android:layout_weight="1"            android:gravity="center_vertical"            android:orientation="horizontal">            <TextView                android:id="@+id/tvTotalPrice"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_alignParentRight="true"                android:text="总价:¥0.00" />        </RelativeLayout>        <Button            android:id="@+id/btnBuy"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="购买" />    </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:layout_height="match_parent"    android:orientation="vertical"    android:padding="10dp">    <RelativeLayout        android:layout_width="match_parent"        android:layout_height="50dp"        android:background="#fff">        <LinearLayout            android:layout_width="wrap_content"            android:layout_height="match_parent"            android:gravity="center_vertical"            android:orientation="horizontal">            <CheckBox                android:id="@+id/checkShop"                android:layout_width="wrap_content"                android:layout_height="wrap_content" />            <TextView                android:id="@+id/tvShopName"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="商家" />        </LinearLayout>        <TextView            android:id="@+id/tvEdit"            android:layout_width="wrap_content"            android:layout_height="match_parent"            android:layout_alignParentRight="true"            android:gravity="center_vertical"            android:text="编辑"            android:textSize="15sp" />    </RelativeLayout>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center_vertical"        android:orientation="horizontal"        android:paddingLeft="20dp">        <CheckBox            android:id="@+id/checkGood"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center_vertical" />        <com.facebook.drawee.view.SimpleDraweeView            android:id="@+id/simple"            android:layout_width="100dp"            android:layout_height="100dp" />        <LinearLayout            android:id="@+id/llOne"            android:layout_width="0dp"            android:layout_height="match_parent"            android:layout_weight="1"            android:gravity="center_vertical"            android:orientation="vertical"            android:visibility="visible">            <TextView                android:id="@+id/tvGoodName"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:maxLines="2"                android:text="" />            <LinearLayout                android:layout_width="match_parent"                android:layout_height="wrap_content"                android:orientation="horizontal">                <TextView                    android:id="@+id/tvPrice"                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:text="0.00" />                <LinearLayout                    android:layout_width="0dp"                    android:layout_height="wrap_content"                    android:layout_weight="1" />                <TextView                    android:id="@+id/tvNum"                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:text="" />            </LinearLayout>        </LinearLayout>        <LinearLayout            android:id="@+id/llTwo"            android:layout_width="0dp"            android:layout_height="match_parent"            android:layout_weight="1"            android:gravity="center_vertical"            android:orientation="horizontal"            android:visibility="gone">            <LinearLayout                android:layout_width="0dp"                android:layout_height="match_parent"                android:layout_weight="1"                android:gravity="center_vertical">                <com.king.shop.custom.MyCustomCar                    android:id="@+id/myCustomCar"                    android:layout_width="match_parent"                    android:layout_height="wrap_content" />            </LinearLayout>            <Button                android:id="@+id/btnDels"                android:layout_width="wrap_content"                android:layout_height="match_parent"                android:text="删除" />        </LinearLayout>    </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:layout_height="match_parent"    android:orientation="horizontal"    android:gravity="center_vertical">    <Button        android:id="@+id/btnDel"        android:layout_width="50dp"        android:layout_height="wrap_content"        android:background="#fff"        android:text="—"/>    <EditText        android:id="@+id/etNum"        android:layout_width="50dp"        android:layout_height="wrap_content"        android:background="@null"/>    <Button        android:id="@+id/btnAdd"        android:layout_width="50dp"        android:layout_height="wrap_content"        android:background="#fff"        android:text="+"/></LinearLayout>
原创粉丝点击