RecyclerView 实现购物车功能

RecyclerView的基本使用:

没有点击事件的接口只能自己写:

public class ShopCarRecycleViewAdapter extends RecyclerView.Adapter<ShopCarRecycleViewAdapter.ViewHolder>{
    private ArrayList<ShopCarData> shopCarDatas;


    private  MainActivity context;

    private ShopCarView shopCarView;

    //删除接口
    private OnDeleteClickListener mOnDeleteClickListener;

    //操作数量的接口
    private OnEditClickListenter mOnEditClickListener;
    private OnResfreshListener mOnResfreshListener;

    public ArrayList<ShopCarData> getShopCarDatas() {
        return shopCarDatas;
    }

    public ShopCarRecycleViewAdapter(MainActivity context, ArrayList<ShopCarData> shopCarDatas,ShopCarView shopCarView) {
        super();

        this.shopCarView=shopCarView;
        this.shopCarDatas=shopCarDatas;
        this.context=context;
    }


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater=LayoutInflater.from(context);
        View view= inflater.inflate(R.layout.shopcar_item,null);
        ViewHolder viewHolder=new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
     //    Log.d("第"+position+"项数据获取是否isfirst",shopCarDatas.get(position).getIsFirst()+"");


        holder.mTvshopname.setText(shopCarDatas.get(position).getShopname());
        holder.productname.setText(shopCarDatas.get(position).getProducename());
        holder.numberTV.setText(shopCarDatas.get(position).getNumber());
        holder.poductprice.setText(shopCarDatas.get(position).getPrice());


        byte[] bytes=shopCarDatas.get(position).getBytes();
        if(bytes!=null){

            BitmapFactory.Options o2 = new BitmapFactory.Options(); //这里定义了一个新的对象...获取的还是同一张图片...
            o2.inSampleSize=8;
            Bitmap bitmap = BitmapFactory.decodeByteArray(bytes,0,bytes.length,o2);

            holder.pic.setImageBitmap(bitmap);
        }
        else {
            Log.d("购物车图片为空","null");
        }


        if (position > 0) {
            if (shopCarDatas.get(position).getShopname().equals(shopCarDatas.get(position - 1).getShopname())) {
                holder.llShopCartHeader.setVisibility(View.GONE);
            } else {
                holder.llShopCartHeader.setVisibility(View.VISIBLE);
            }
        }else {
            holder.llShopCartHeader.setVisibility(View.VISIBLE);
        }
        //链接:http://www.jianshu.com/p/6c3328f87fc9


        //根据选中的状态值进行重绘
        //选中状态

        if(shopCarDatas.get(position).isSelect()){
            holder.shopproductSelect.setImageDrawable(context.getResources().getDrawable(R.drawable.shopcart_selected));
        }else {
            holder.shopproductSelect.setImageDrawable(context.getResources().getDrawable(R.drawable.shopcart_unselected));
        }

        if(shopCarDatas.get(position).isShopSelect()){
            holder.shopselect.setImageDrawable(context.getResources().getDrawable(R.drawable.shopcart_selected));
        }else {
            holder.shopselect.setImageDrawable(context.getResources().getDrawable(R.drawable.shopcart_unselected));
        }

       // 每次绘制 刷新  都会触发这个方法
        if(mOnResfreshListener != null){
            boolean isSelect = false;
            //返回一个是否全部选中的参数
            for(int i = 0;i < shopCarDatas.size(); i++){
                if(!shopCarDatas.get(i).isSelect()){
                    isSelect = false;
                    break;
                }else{
                    isSelect = true;
                }
            }
            mOnResfreshListener.onResfresh(isSelect,position);
        }



        //设置商品点击时间,并通知重绘
        holder.shopproductSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //如果点击一定和当前状态不同,设置点击的状态

                shopCarDatas.get(position).setSelect(!shopCarDatas.get(position).isSelect());

                //通过循环找出不同商铺被标记的第一个商品的位置
                for(int i = 0;i < shopCarDatas.size(); i++){
                    if(shopCarDatas.get(i).getIsFirst() == 1) {

                        //遍历去找出同一家商铺的所有商品的勾选情况
                        for(int j = 0;j < shopCarDatas.size();j++){
                            //如果是同一家商铺的商品,并且其中一个商品是未选中,
                            //那么商铺的全选勾选取消
                            if(shopCarDatas.get(j).getShopname().equals(shopCarDatas.get(i).getShopname().toString())
                                    && !shopCarDatas.get(j).isSelect()){
                                shopCarDatas.get(i).setShopSelect(false);
                                break;
                            }else{
                                //如果是同一家商铺的商品,并且所有商品是选中,那么商铺的选中全选勾选
                                shopCarDatas.get(i).setShopSelect(true);
                            }
                        }
                    }
                }
                notifyDataSetChanged();
            }
        });

        //商店购销点击事件
        holder.shopselect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //如果position的isFirst为1,证明是每个商铺的第一件商品
                //而且这件商品有商铺的头部header
                if(shopCarDatas.get(position).getIsFirst() == 1) {
                    //isShopSelect取反选
                    shopCarDatas.get(position).setShopSelect(!shopCarDatas.get(position).isShopSelect());

                    for(int i = 0;i < shopCarDatas.size();i++){
                        //如果Shopid与position的Shopid相同,
                        // 则设置它的选中情况与position的isShopSelect选中情况一样
                        if(shopCarDatas.get(i).getShopname().equals(shopCarDatas.get(position).getShopname().toString()) ){
                            shopCarDatas.get(i).setSelect(shopCarDatas.get(position).isShopSelect());
                        }
                    }
                    notifyDataSetChanged();
                }
            }
        });


        holder.minusIV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //
                int number=Integer.parseInt(shopCarDatas.get(position).getNumber());
                if(number>0){
                    String producename=shopCarDatas.get(position).getProducename();
                    number=number-1;
                    if (mOnEditClickListener != null) {
                        Log.d("mOnEditClick","1234");
                        mOnEditClickListener.onEditClick( position,producename,number);
                    }
                    else {
                        Log.d("mOnEditClick","null");

                    }
                    shopCarDatas.get(position).setNumber(number+"");
                    notifyDataSetChanged();
                }

            }

        });

        holder.addIV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int number=Integer.parseInt(shopCarDatas.get(position).getNumber());
                String producename=shopCarDatas.get(position).getProducename();
                number=number+1;
                if (mOnEditClickListener != null) {
                     mOnEditClickListener.onEditClick( position,producename,number);
                }
                else {
                }
                shopCarDatas.get(position).setNumber(number+"");
                notifyDataSetChanged();

            }
        });

        holder.deleteIV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //调用删除某个规格商品的接口
                if(mOnDeleteClickListener != null){
                    mOnDeleteClickListener.onDeleteClick(view,position,shopCarDatas.get(position).getProducename());
                }

                shopCarDatas.remove(position);
                //重新排序,标记所有商品不同商铺第一个的商品位置
                shopCarView.isSelectFirst(shopCarDatas);
                notifyDataSetChanged();
            }
        });

    }

    //提供删除接口
    public interface OnDeleteClickListener{
        void onDeleteClick(View view, int position, String productname);
    }

    public void setOnDeleteClickListener(OnDeleteClickListener mOnDeleteClickListener){
        this.mOnDeleteClickListener = mOnDeleteClickListener;
    }

    //提供更改数量的接口
    public interface OnEditClickListenter{
        void onEditClick(int postion, String productname, int count);
    }
    public void setOnEditClickListenter(OnEditClickListenter onEditClickListenter){
        this.mOnEditClickListener =onEditClickListenter;
    }

    //和Acitivity 交互的回调
    public interface OnResfreshListener{
        void onResfresh(boolean isSelect,int postion);
    }

    public void setResfreshListener(OnResfreshListener mOnResfreshListener){
        this.mOnResfreshListener = mOnResfreshListener;
    }

    @Override
    public int getItemCount() {
        return shopCarDatas.size();
    }


    //自定义的ViewHolder,持有每个Item的的所有界面元素

    public static class ViewHolder extends RecyclerView.ViewHolder {
        //店名
        //商品名
        @BindView(R.id.tv_item_shopcart_shopname)
        public TextView mTvshopname;
        //数量
        @BindView(R.id.et_item_shopcart_cloth_num)
        public TextView numberTV;
        //商店布局
        @BindView(R.id.ll_shopcart_header)
        LinearLayout llShopCartHeader;

        @BindView(R.id.tv_item_shopcart_productname)
        TextView  productname;

        @BindView(R.id.tv_item_shopcart_product_price)
        TextView  poductprice;

        @BindView(R.id.iv_item_shopcart_shopselect)
        ImageView shopselect;

        @BindView(R.id.tv_item_shopcart_clothselect)
        ImageView shopproductSelect;

        @BindView(R.id.iv_item_shopcart_cloth_minus)
        ImageView minusIV;
        @BindView(R.id.iv_item_shopcart_cloth_add)
        ImageView addIV;

        @BindView(R.id.iv_item_shopcart_cloth_delete)
        ImageView deleteIV;

        @BindView(R.id.shopcar_pic)
        ImageView pic;


        public ViewHolder(View view){
            super(view);
            ButterKnife.bind(this,view);
        }


    }


    //

    //





}

setAdapter:

 tvcommitOrder=shopcarview.findViewById(R.id.tv_shopcart_submit);
        //设置布局管理器
        mRecyclerView.setLayoutManager(new LinearLayoutManager(mainActivity));
        //设置adapter
        mRecyclerView.setAdapter(shopCarRecycleViewAdapter);
        //设置Item增加、移除动画
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        //添加分割线
        //   mRecyclerView.addItemDecoration(new DividerItemDecoration(mainActivity, DividerItemDecoration.HORIZONTAL_LIST));
        basePager_fl.addView(shopcarview);

几种回调事件的实现思路

   //全选
        tvShopCartSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(user!=null){

                    mSelect = !mSelect;
                    if(mSelect){
                        Drawable left = mainActivity.getResources().getDrawable(R.drawable.shopcart_selected);
                        tvShopCartSelect.setCompoundDrawablesWithIntrinsicBounds(left,null,null,null);
                        for(int i = 0;i < shopCarDatas.size();i++){
                            shopCarDatas.get(i).setSelect(true);
                            shopCarDatas.get(i).setShopSelect(true);
                        }
                    }else{
                        Drawable left = mainActivity.getResources().getDrawable(R.drawable.shopcart_unselected);
                        tvShopCartSelect.setCompoundDrawablesWithIntrinsicBounds(left,null,null,null);
                        for(int i = 0;i < shopCarDatas.size();i++){
                            shopCarDatas.get(i).setSelect(false);
                            shopCarDatas.get(i).setShopSelect(false);
                        }
                    }
                    shopCarRecycleViewAdapter.notifyDataSetChanged();


                }
            }



        });
        //更改数量
        shopCarRecycleViewAdapter.setOnEditClickListenter(new ShopCarRecycleViewAdapter.OnEditClickListenter() {
            @Override
            public void onEditClick(int postion, String productname, int count) {

                userDb.updataSCProductnunber(user.getAccount(),productname,count+"");
            }
        });
        //删除
        shopCarRecycleViewAdapter.setOnDeleteClickListener(new ShopCarRecycleViewAdapter.OnDeleteClickListener() {
            @Override
            public void onDeleteClick(View view, int position, String productname) {

                userDb.deletePdinShopcar(user.getAccount(),productname);
                //删除数据后重新计算最下面两栏的数据

                Log.d("删除回调","执行");
                //这里因为比上一个慢半拍所以等于1 其实已经是没有数据了
                if(shopCarDatas.size()==1){
                    tv_shopcart_totalprice.setText("总价:" + 0);
                    tvShopCartTotalNum.setText("共" +0 + "件商品");
                }
                else {
                }

            }
        });
        //
        shopCarRecycleViewAdapter.setResfreshListener(new ShopCarRecycleViewAdapter.OnResfreshListener() {
            @Override
            public void onResfresh(boolean isSelect,int positon) {
                Log.d("onResfresh","!!resfresh");
                //处理点击后图标变化的
                mSelect = isSelect;
                if (mSelect) {
                    Drawable left = mainActivity.getResources().getDrawable(R.drawable.shopcart_selected);
                    tvShopCartSelect.setCompoundDrawablesWithIntrinsicBounds(left, null, null, null);

                } else {
                    Drawable left = mainActivity.getResources().getDrawable(R.drawable.shopcart_unselected);
                    tvShopCartSelect.setCompoundDrawablesWithIntrinsicBounds(left, null, null, null);
                }


                if (positon==shopCarDatas.size()-1){
                    //遍历集合 给后面的赋值 而赋值操作只有最后一项绘制完成后才需要。
                    int mTotalNum = 0;
                    int mTotalPrice=0;
                    for(int i = 0; i < shopCarDatas.size(); i++)
                        if(shopCarDatas.get(i).isSelect()) {
                            float  oneprice = Integer.parseInt(shopCarDatas.get(i).getPrice());
                            float  number= Integer.parseInt(shopCarDatas.get(i).getNumber());
                            mTotalPrice += oneprice * number;
                            mTotalNum += 1;
                        }

                    tv_shopcart_totalprice.setText("总价:" + mTotalPrice);
                    tvShopCartTotalNum.setText("共" + mTotalNum + "件商品");
                    Log.d("第"+positon+"项","(最后一项)改变Text");
                }
                else {
                    Log.d("第"+positon+"项","正在判断select");
                }



            }
        });
        tvcommitOrder.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(user!=null){

                    Intent startsureOrderActivity=new Intent(mainActivity, SureOrderActivity.class);
                    ArrayList<ShopCarData> selectShopCardata=new ArrayList<ShopCarData>();
                    for(int i = 0; i < shopCarDatas.size(); i++)
                        if(shopCarDatas.get(i).isSelect()) {
                            selectShopCardata.add(shopCarDatas.get(i));
                        }

                    startsureOrderActivity.putExtra("dataBean",selectShopCardata);
                    startsureOrderActivity.putExtra("flag","shopcar");
                    mainActivity.startActivity(startsureOrderActivity);
                }
            }
        });

    }


    /**
     * 给每个商品添加头属性
     * @param list
     */
    public static void isSelectFirst(ArrayList<ShopCarData> list){
        if(list.size() > 0) {
            //头个商品一定属于它所在商铺的第一个位置,isFirst标记为1.
            list.get(0).setIsFirst(1);

            for (int i = 1; i < list.size(); i++) {
                //每个商品跟它前一个商品比较,如果Shopid相同isFirst则标记为2,
                //如果Shopid不同,isFirst标记为1.
                if (list.get(i).getShopname().equals(list.get(i - 1).getShopname().toString())) {
                    list.get(i).setIsFirst(2);
                } else {
                    list.get(i).setIsFirst(1);
                }
            }
        }
    }

Adapter 的细节处理:

可以通过多个构造函数 生成一个 Adapter  并将List 根据构造函数赋值
这样做的意义在于 可以先初始化 再更新数据
    public FlashSaleRecycleViewAdapter() {
        this.repositories = null;

    }

    public FlashSaleRecycleViewAdapter(ArrayList<FlashPruductData> repositories) {
        this.repositories = repositories;

    }

获取布局可以和直接通过parent 参数 这样构造函数就不用 传递context 了
 @Override
    public RepositoryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        final View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.flashsale_rv_item, parent, false);

        RepositoryViewHolder viewHolder=new RepositoryViewHolder(itemView);

        return viewHolder;
    }



出现的特殊问题:

adapter 中的Bitmap 回收问题!

可以注意在 view 被收回时可以执行一些 方法 回收资源
但是不可以回收一个正在被使用的Bitmap 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值