Android一级购物车简单实现

来源:互联网 发布:淘宝店铺装修页头没了 编辑:程序博客网 时间:2024/04/29 04:26

MainActivity类

package wangyetian.bwie.com.shopcar;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.CheckBox;import android.widget.TextView;import com.google.gson.Gson;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {    private RecyclerView ry;    private List<ShopBean.OrderDataBean.CartlistBean> mAllOrderList = new ArrayList<>();    private RecyclerView mRy;    private CheckBox mQuan;    private TextView mZPrice;    private TextView mZCount;    private int price=0;    private int count=0;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        mRy.setLayoutManager(new LinearLayoutManager(this));        getData();        final Adapter adapter = new Adapter(this, mAllOrderList);        mRy.setAdapter(adapter);        //监听适配类回调的方法 用于计算总价和总数量 还有给全选赋值        adapter.setonClickCbListener(new Adapter.onClickCbListener() {            @Override            public void onCBListener(boolean flag, List<ShopBean.OrderDataBean.CartlistBean> mList) {                mAllOrderList  = mList;                mQuan.setChecked(flag);                for (int i = 0; i < mList.size(); i++) {                    if (mList.get(i).isCheck()){                        price += mList.get(i).getPrice()*mList.get(i).getCount();                        count += mList.get(i).getCount();                    }                }                mZPrice.setText(price +"");                mZCount.setText(count +"");                price =0;                count =0;            }        });        //全选的点击事件        mQuan.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                boolean flag = mQuan.isChecked();                if (adapter != null){                    adapter.getCB(flag);                }            }        });    }    private void initView() {        mRy = (RecyclerView) findViewById(R.id.ry);        mQuan = (CheckBox) findViewById(R.id.quan);        mZPrice = (TextView) findViewById(R.id.zPrice);        mZCount = (TextView) findViewById(R.id.zCount);    }    public void getData() {        try {            //模拟网络请求            InputStream inputStream = getAssets().open("shop.json");            String data = convertStreamToString(inputStream);            Gson gson = new Gson();            ShopBean shopBean = gson.fromJson(data, ShopBean.class);            for (int i = 0; i < shopBean.getOrderData().size(); i++) {                int length = shopBean.getOrderData().get(i).getCartlist().size();                for (int j = 0; j < length; j++) {                    mAllOrderList.add(shopBean.getOrderData().get(i).getCartlist().get(j));                }            }        } catch (Exception e) {            e.printStackTrace();        }    }    public static String convertStreamToString(InputStream is) {        /*          * To convert the InputStream to String we use the BufferedReader.readLine()          * method. We iterate until the BufferedReader return null which means          * there's no more data to read. Each line will appended to a StringBuilder          * and returned as String.          */        BufferedReader reader = new BufferedReader(new InputStreamReader(is));        StringBuilder sb = new StringBuilder();        String line = null;        try {            while ((line = reader.readLine()) != null) {                sb.append(line);            }        } catch (IOException e) {            e.printStackTrace();        } finally {            try {                is.close();            } catch (IOException e) {                e.printStackTrace();            }        }        return sb.toString();    }}

自定义控件类

package wangyetian.bwie.com.shopcar;import android.content.Context;import android.content.res.TypedArray;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.LinearLayout;/** * Created by hp on 2017/11/18. */public class AmountView extends LinearLayout {    private static final String TAG = "AmountView";    private int amount = 1; //购买数量    private OnAmountChangeListener mListener;    private EditText etAmount;    private Button btnDecrease;    private Button btnIncrease;    public void setEtAmount(int count) {        etAmount.setText(count +"");    }    public AmountView(Context context) {        this(context, null);    }    public AmountView(Context context, final AttributeSet attrs) {        super(context, attrs);        LayoutInflater.from(context).inflate(R.layout.zdy, this);        etAmount = (EditText) findViewById(R.id.etAmount);        btnDecrease = (Button) findViewById(R.id.btnDecrease);        btnIncrease = (Button) findViewById(R.id.btnIncrease);        TypedArray obtainStyledAttributes = getContext().obtainStyledAttributes(attrs, R.styleable.AmountView);        obtainStyledAttributes.recycle();        //减        btnDecrease.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View view) {                amount = Integer.parseInt(etAmount.getText().toString());                if (amount > 1) {                    amount--;                    etAmount.setText(amount + "");                }                //回调到适配类                mListener.onAmountChange(amount);            }        });        //加        btnIncrease.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View view) {                amount = Integer.parseInt(etAmount.getText().toString());                amount++;                etAmount.setText(amount + "");                mListener.onAmountChange(amount);            }        });    }    public interface OnAmountChangeListener {        void onAmountChange(int amount);    }    public void setOnAmountChangeListener(OnAmountChangeListener onAmountChangeListener){        mListener = onAmountChangeListener;    }}

适配器

package wangyetian.bwie.com.shopcar;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.TextView;import java.util.List;/** * Created by hp on 2017/11/18. */public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {    private List<ShopBean.OrderDataBean.CartlistBean> list;    private Context context;    private onClickCbListener onClickCbListener;    public Adapter(Context context, List<ShopBean.OrderDataBean.CartlistBean> list) {        this.context = context;        this.list = list;    }    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view = View.inflate(context,R.layout.ry_item,null);        ViewHolder1 viewHolder1 = new ViewHolder1(view);        return viewHolder1;    }    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {        final ViewHolder1 mHolder = (ViewHolder1) holder;        mHolder.cb.setChecked(list.get(position).isCheck());        mHolder.price.setText(list.get(position).getPrice()+"");        mHolder.zdy.setEtAmount(list.get(position).getCount());        //多选框点击        mHolder.cb.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                //重新给集合赋值                list.get(position).setCheck(mHolder.cb.isChecked());                notifyChanged(position);            }        });        //自定义控件        mHolder.zdy.setOnAmountChangeListener(new AmountView.OnAmountChangeListener() {            @Override            public void onAmountChange(int amount) {                //把变化后的数量重新赋给集合                list.get(position).setCount(amount);                notifyChanged(position);            }        });        //删除的点击事件        mHolder.del.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                list.remove(position);                notifyChanged(position);            }        });    }    //刷新和回调    public void notifyChanged(int position){        boolean flag = true;        for (int i = 0; i < list.size(); i++) {            if (!list.get(i).isCheck()){                flag = false;                break;            }        }        notifyDataSetChanged();        onClickCbListener.onCBListener(flag,list);    }    //全选的方法    public void getCB(boolean flag){        for (int i = 0; i < list.size(); i++) {            list.get(i).setCheck(flag);        }        notifyDataSetChanged();        onClickCbListener.onCBListener(flag,list);    }    interface onClickCbListener{       void  onCBListener(boolean flag,List<ShopBean.OrderDataBean.CartlistBean> mList);    }    public void setonClickCbListener(onClickCbListener onClickCbListener){        this.onClickCbListener = onClickCbListener;    }    @Override    public int getItemCount() {        return list.size();    }    class ViewHolder1 extends RecyclerView.ViewHolder{        TextView price;        CheckBox cb;        AmountView zdy;        Button del;        public ViewHolder1(View itemView) {            super(itemView);            price = itemView.findViewById(R.id.price);            cb = itemView.findViewById(R.id.cb);            zdy = itemView.findViewById(R.id.zdy);            del = itemView.findViewById(R.id.del);        }    }}

bean类

package wangyetian.bwie.com.shopcar;import java.util.List;/** * Created by hp on 2017/11/17. */public class ShopBean {    /**     * code : 200     * orderData : [{"shopId":1,"shopName":"京东自营","cartlist":[{"id":1,"shopId":1,"shopName":"京东自营","defaultPic":"https://img30.360buyimg.com/popWareDetail/jfs/t3208/194/7616404169/244198/369625db/58b7d093N03520fb7.jpg","productId":1,"productName":"三只松鼠_零食大礼包","color":"黑色","size":"18L","price":20,"count":1},{"id":2,"shopId":1,"shopName":"京东自营","defaultPic":"https://img14.360buyimg.com/n0/jfs/t2971/15/167732091/93002/204c1016/574d9d9aNe4e6fa7a.jpg","productId":2,"productName":"小米心跳手环","color":"白色","size":"20XXL","price":148,"count":1}]},{"shopId":2,"shopName":"海澜之家","cartlist":[{"id":1,"shopId":2,"shopName":"海澜之家","defaultPic":"https://img30.360buyimg.com/popWaterMark/jfs/t4075/83/1343091204/132469/9034cb9c/5873496bN68020ba8.jpg","productId":1,"productName":"短袖T恤男 2017夏季新品","color":"蓝色","size":"30X","price":181,"count":1}]},{"shopId":3,"shopName":"OPPO官方旗舰店","cartlist":[{"id":1,"shopId":3,"shopName":"OPPO官方旗舰店","defaultPic":"https://img10.360buyimg.com/cms/jfs/t6064/272/2163314583/157700/442d6477/593c1c49N7c63a7d9.jpg","productId":1,"productName":"OPPO R11 全网通","color":"蓝色","size":"30X","price":1999,"count":1},{"id":2,"shopId":3,"shopName":"OPPO官方旗舰店","defaultPic":"https://img14.360buyimg.com/n0/jfs/t3142/194/4953241722/254855/1651c2b1/585b9021Nf653e48a.jpg","productId":1,"productName":"OPPO R9 全网通","color":"蓝色","size":"30X","price":999,"count":1}]},{"shopId":3,"shopName":"OPPO官方旗舰店","cartlist":[{"id":1,"shopId":3,"shopName":"OPPO官方旗舰店","defaultPic":"https://img10.360buyimg.com/cms/jfs/t6064/272/2163314583/157700/442d6477/593c1c49N7c63a7d9.jpg","productId":1,"productName":"OPPO R11 全网通","color":"蓝色","size":"30X","price":1999,"count":1},{"id":2,"shopId":3,"shopName":"OPPO官方旗舰店","defaultPic":"https://img14.360buyimg.com/n0/jfs/t3142/194/4953241722/254855/1651c2b1/585b9021Nf653e48a.jpg","productId":1,"productName":"OPPO R9 全网通","color":"蓝色","size":"30X","price":999,"count":1}]},{"shopId":3,"shopName":"OPPO官方旗舰店","cartlist":[{"id":1,"shopId":3,"shopName":"OPPO官方旗舰店","defaultPic":"https://img10.360buyimg.com/cms/jfs/t6064/272/2163314583/157700/442d6477/593c1c49N7c63a7d9.jpg","productId":1,"productName":"OPPO R11 全网通","color":"蓝色","size":"30X","price":1999,"count":1},{"id":2,"shopId":3,"shopName":"OPPO官方旗舰店","defaultPic":"https://img14.360buyimg.com/n0/jfs/t3142/194/4953241722/254855/1651c2b1/585b9021Nf653e48a.jpg","productId":1,"productName":"OPPO R9 全网通","color":"蓝色","size":"30X","price":999,"count":1}]},{"shopId":3,"shopName":"OPPO官方旗舰店","cartlist":[{"id":1,"shopId":3,"shopName":"OPPO官方旗舰店","defaultPic":"https://img10.360buyimg.com/cms/jfs/t6064/272/2163314583/157700/442d6477/593c1c49N7c63a7d9.jpg","productId":1,"productName":"OPPO R11 全网通","color":"蓝色","size":"30X","price":1999,"count":1},{"id":2,"shopId":3,"shopName":"OPPO官方旗舰店","defaultPic":"https://img14.360buyimg.com/n0/jfs/t3142/194/4953241722/254855/1651c2b1/585b9021Nf653e48a.jpg","productId":1,"productName":"OPPO R9 全网通","color":"蓝色","size":"30X","price":999,"count":1}]}]     */    private int code;    private List<OrderDataBean> orderData;    public int getCode() {        return code;    }    public void setCode(int code) {        this.code = code;    }    public List<OrderDataBean> getOrderData() {        return orderData;    }    public void setOrderData(List<OrderDataBean> orderData) {        this.orderData = orderData;    }    public static class OrderDataBean {        /**         * shopId : 1         * shopName : 京东自营         * cartlist : [{"id":1,"shopId":1,"shopName":"京东自营","defaultPic":"https://img30.360buyimg.com/popWareDetail/jfs/t3208/194/7616404169/244198/369625db/58b7d093N03520fb7.jpg","productId":1,"productName":"三只松鼠_零食大礼包","color":"黑色","size":"18L","price":20,"count":1},{"id":2,"shopId":1,"shopName":"京东自营","defaultPic":"https://img14.360buyimg.com/n0/jfs/t2971/15/167732091/93002/204c1016/574d9d9aNe4e6fa7a.jpg","productId":2,"productName":"小米心跳手环","color":"白色","size":"20XXL","price":148,"count":1}]         */        private int shopId;        private String shopName;        private List<CartlistBean> cartlist;        public int getShopId() {            return shopId;        }        public void setShopId(int shopId) {            this.shopId = shopId;        }        public String getShopName() {            return shopName;        }        public void setShopName(String shopName) {            this.shopName = shopName;        }        public List<CartlistBean> getCartlist() {            return cartlist;        }        public void setCartlist(List<CartlistBean> cartlist) {            this.cartlist = cartlist;        }        public static class CartlistBean {            /**             * id : 1             * shopId : 1             * shopName : 京东自营             * defaultPic : https://img30.360buyimg.com/popWareDetail/jfs/t3208/194/7616404169/244198/369625db/58b7d093N03520fb7.jpg             * productId : 1             * productName : 三只松鼠_零食大礼包             * color : 黑色             * size : 18L             * price : 20             * count : 1             */            private int id;            private int shopId;            private String shopName;            private String defaultPic;            private int productId;            private String productName;            private String color;            private String size;            private int price;            private int count;            private boolean check;            public int getId() {                return id;            }            public void setId(int id) {                this.id = id;            }            public int getShopId() {                return shopId;            }            public void setShopId(int shopId) {                this.shopId = shopId;            }            public String getShopName() {                return shopName;            }            public void setShopName(String shopName) {                this.shopName = shopName;            }            public String getDefaultPic() {                return defaultPic;            }            public void setDefaultPic(String defaultPic) {                this.defaultPic = defaultPic;            }            public int getProductId() {                return productId;            }            public void setProductId(int productId) {                this.productId = productId;            }            public String getProductName() {                return productName;            }            public void setProductName(String productName) {                this.productName = productName;            }            public String getColor() {                return color;            }            public void setColor(String color) {                this.color = color;            }            public String getSize() {                return size;            }            public void setSize(String size) {                this.size = size;            }            public int getPrice() {                return price;            }            public void setPrice(int price) {                this.price = price;            }            public int getCount() {                return count;            }            public void setCount(int count) {                this.count = count;            }            public boolean isCheck() {                return check;            }            public void setCheck(boolean check) {                this.check = check;            }        }    }}

MainActivity布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout 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"    android:orientation="vertical"    tools:context="wangyetian.bwie.com.shopcar.MainActivity">    <android.support.v7.widget.RecyclerView        android:id="@+id/ry"        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1"/>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="50dp"        android:orientation="horizontal">        <CheckBox            android:id="@+id/quan"            android:layout_width="wrap_content"            android:layout_height="wrap_content" />        <TextView            android:id="@+id/zPrice"            android:layout_width="100dp"            android:layout_height="50dp" />        <TextView            android:id="@+id/zCount"            android:layout_width="match_parent"            android:layout_height="match_parent" />    </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">    <Button        android:id="@+id/btnDecrease"        android:layout_width="0dp"        android:layout_height="match_parent"        android:layout_weight="1"        android:background="#f00"        android:gravity="center"        android:text="-" />    <EditText        android:id="@+id/etAmount"        android:layout_width="0dp"        android:layout_height="match_parent"        android:layout_weight="2"        android:background="@null"        android:gravity="center"        android:inputType="number"        android:minWidth="60dp"        android:text="1" />    <Button        android:id="@+id/btnIncrease"        android:layout_width="0dp"        android:layout_height="match_parent"        android:layout_weight="1"        android:background="#f0f"        android:gravity="center"        android:text="+" /></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="100dp"    android:orientation="horizontal">    <CheckBox        android:id="@+id/cb"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_vertical"/>    <TextView        android:id="@+id/price"        android:layout_width="200dp"        android:layout_height="100dp"        android:gravity="center"/>    <wangyetian.bwie.com.shopcar.AmountView        android:id="@+id/zdy"        android:layout_width="0dp"        android:layout_weight="1"        android:layout_height="match_parent"        />    <Button        android:id="@+id/del"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="删除"/></LinearLayout>

attrs文件

<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="AmountView">        <!-- 左右2边+-按钮的宽度 -->        <attr name="btnWidth" format="dimension" />        <!-- 中间TextView的宽度 -->        <attr name="tvWidth" format="dimension" />        <!--<attr name="tvColor" format="color"/>-->        <attr name="tvTextSize" format="dimension"/>        <attr name="btnTextSize" format="dimension"/>    </declare-styleable></resources>