购物车-Adapter&widght&AddDecreaseView

本文详细介绍了一个购物车功能的实现过程,包括自增自减视图组件的开发,以及购物车主页面的布局与交互设计。通过自定义AddDecreaseView组件,实现了商品数量的增减,并在GWC主页面中展示了商品列表,支持全选、计算总价等功能。
widght-AddDecreaseView

package com.example.dsover.gouwuche.widget;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.example.dsover.R;

/**
 * Created by 红鼻子小黑 on 2018/10/25.
 */

public class AddDecreaseView extends RelativeLayout implements View.OnClickListener {
    private TextView txtAdd;
    private TextView txtDecrease;
    private TextView txtNum;
    private int num;

    public interface OnAddDecreaseClickListener{
        void add(int num);
        void decrease(int num);
    }
    private OnAddDecreaseClickListener listener;
    public void setOnAddDecreaseClickListener(OnAddDecreaseClickListener listener){
        this.listener = listener;
    }
    public AddDecreaseView(Context context) {
        this(context,null);
    }

    public AddDecreaseView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public AddDecreaseView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    private void init(Context context) {
        View.inflate(context, R.layout.item_add_decrease,this);
        txtAdd = findViewById(R.id.txt_add);
        txtDecrease = findViewById(R.id.txt_decrease);
        txtNum = findViewById(R.id.txt_num);
        txtNum.setText("1");
        txtAdd.setOnClickListener(this);
        txtDecrease.setOnClickListener(this);
    }
    public void setNum(int num){
        this.num = num;
        txtNum.setText(num+"");
    }
    public int getNum(){
        return num;
    }
    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.txt_add:
                num++;
                txtNum.setText(num+"");
                if (listener!=null){
                    listener.add(num);
                }
                break;
            case R.id.txt_decrease:
                if (num>1){
                    num--;
                }
                txtNum.setText(num+"");
                if (listener!=null){
                    listener.decrease(num);
                }
        }
    }
}

GWC主页面

package com.example.dsover.fragment;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;

import com.example.dsover.R;
import com.example.dsover.bean.MessagerBean;
import com.example.dsover.bean.Product;
import com.example.dsover.bean.Shopper;
import com.example.dsover.gouwuche.adapter.ProductAdapter;
import com.example.dsover.gouwuche.adapter.ShopperAdapter;
import com.example.dsover.gouwuche.cart.presenter.CartPresenter;
import com.example.dsover.gouwuche.cart.view.IView;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by 红鼻子小黑 on 2018/10/25.
 */

public class GwcFragment extends Fragment implements IView{
    private TextView txtEditFinsh;
    private CheckBox cbtal;
    private TextView txtPrice;
    private Button btnCalu;
    private RecyclerView rvShopper;
    private List<Shopper<List<Product>>> list;
    private ShopperAdapter shopperAdapter;
    private CartPresenter cartPresenter;
    private View view;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.item_gwc,container,false);
        return view;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initView();
        initData();
        setListener();

    }
    private void setListener() {
        cbtal.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                boolean isChecked = cbtal.isChecked();
                for (Shopper<List<Product>> listShopper:list){
                    listShopper.setChecked(isChecked);
                    List<Product> products = listShopper.getList();
                    for (Product product : products){
                        product.setChecked(isChecked);
                    }
                }
                shopperAdapter.notifyDataSetChanged();
            }
        });
    }

    private void initData() {
        list = new ArrayList<>();
        shopperAdapter = new ShopperAdapter(getActivity(),list);
        shopperAdapter.setOnShopperClickListener(new ShopperAdapter.OnShopperClickListener() {
            @Override
            public void onShopperClick(int position, boolean isCheck) {
                if (!isCheck){
                    cbtal.setChecked(false);
                }else{
                    boolean isAllShopperChecked = true;
                    for (Shopper<List<Product>> listShopper :list){
                        if (!listShopper.isChecked()){
                            isAllShopperChecked = false;
                            break;
                        }
                    }
                    cbtal.setChecked(isAllShopperChecked);
                }
                calculatePrice();
            }
        });
        shopperAdapter.setOnAddDecreaseProductListener(new ProductAdapter.OnAddDecreaseProductListener() {
            @Override
            public void onChange(int position, int num) {
                calculatePrice();
            }
        });
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
        rvShopper.setLayoutManager(layoutManager);
        rvShopper.addItemDecoration(new DividerItemDecoration(getActivity(),DividerItemDecoration.VERTICAL));
        rvShopper.setAdapter(shopperAdapter);
        cartPresenter = new CartPresenter();
        cartPresenter.attch(this);
        cartPresenter.getData();
    }

    private void calculatePrice() {
        float totalPrice = 0;
        for (Shopper<List<Product>> listShopper : list){
            List<Product> list = listShopper.getList();
            for (Product product : list){
                if (product.isChecked()){
                    totalPrice += product.getNum() * product.getPrice();
                }
            }
        }
        txtPrice.setText("总价:" + totalPrice);
    }

    private void initView() {
        txtEditFinsh = view.findViewById(R.id.txt_edit_or_finish);
        cbtal = view.findViewById(R.id.cb_total_select);
        txtPrice = view.findViewById(R.id.txt_total_price);
        btnCalu = view.findViewById(R.id.btn_calu);
        rvShopper = view.findViewById(R.id.rv_shopper);
    }

    @Override
    public void success(MessagerBean<List<Shopper<List<Product>>>> data) {
        if (data!=null){
            List<Shopper<List<Product>>> shoppers = data.getData();
            if (shoppers!=null){
            list.clear();
            list.addAll(shoppers);
            shopperAdapter.notifyDataSetChanged();
            }
        }
    }

    @Override
    public void failed(Exception e) {
        Toast.makeText(getActivity(),e.getMessage(),Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (cartPresenter!=null){
            cartPresenter.detach();
        }
    }
}

shopperAdapter

package com.example.dsover.gouwuche.adapter;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;

import com.example.dsover.R;
import com.example.dsover.bean.Product;
import com.example.dsover.bean.Shopper;

import java.util.List;

/**
 * Created by 红鼻子小黑 on 2018/10/25.
 */

public class ShopperAdapter extends RecyclerView.Adapter<ShopperAdapter.ViewHolder>{
    private Context context;
    private List<Shopper<List<Product>>> list;

    public ShopperAdapter(Context context, List<Shopper<List<Product>>> list) {
        this.context = context;
        this.list = list;
    }
    public interface OnShopperClickListener{
        void onShopperClick(int position,boolean isCheck);
    }
    private OnShopperClickListener shopperClickListener;
    public void setOnShopperClickListener(OnShopperClickListener listener){
        this.shopperClickListener = listener;
    }
    private ProductAdapter.OnAddDecreaseProductListener productListener;

    public void setOnAddDecreaseProductListener(ProductAdapter.OnAddDecreaseProductListener listener){
        this.productListener = listener;
    }
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = View.inflate(context,R.layout.item_shopper,null);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
        final Shopper<List<Product>> shopper = list.get(position);
        holder.txtShopperName.setText(shopper.getSellerName());
        RecyclerView.LayoutManager playoutManager = new LinearLayoutManager(context);
        holder.rvProduct.setLayoutManager(playoutManager);
        final ProductAdapter productAdapter = new ProductAdapter(context,shopper.getList());
        if (productListener!=null){
            productAdapter.setOnAddDecreaseProductListener(productListener);
        }
            productAdapter.setOnProductClickListener(new ProductAdapter.OnproductClickListener() {
                @Override
                public void onProductClick(int position, boolean isChecked) {
                    if (!isChecked){
                        shopper.setChecked(false);
                        shopperClickListener.onShopperClick(position,false);
                    }else{
                        boolean isAllProductSelected = true;
                        for (Product product:shopper.getList()){
                            if (!product.isChecked()){
                                isAllProductSelected = false;
                                break;
                            }
                        }
                        shopper.setChecked(isAllProductSelected);
                        shopperClickListener.onShopperClick(position,true);
                    }
                    notifyDataSetChanged();
                    productListener.onChange(0,0);
                }
            });

        holder.rvProduct.setAdapter(productAdapter);
        holder.cbHopper.setOnCheckedChangeListener(null);
        holder.cbHopper.setChecked(shopper.isChecked());
        holder.cbHopper.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
                shopper.setChecked(isChecked);
                List<Product> productList = shopper.getList();
                for (Product product : productList){
                    product.setChecked(isChecked);
                }
                productAdapter.notifyDataSetChanged();
                if (shopperClickListener!=null){
                    shopperClickListener.onShopperClick(position,isChecked);
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return list.size();
    }
    class ViewHolder extends RecyclerView.ViewHolder{
        private CheckBox cbHopper;
        private TextView txtShopperName;
        private RecyclerView rvProduct;
        public ViewHolder (View itemView){
            super(itemView);
            cbHopper = itemView.findViewById(R.id.cb_shopper);
            txtShopperName = itemView.findViewById(R.id.txt_shopper_name);
            rvProduct = itemView.findViewById(R.id.rv_product);
        }
    }
}

product

package com.example.dsover.gouwuche.adapter;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.example.dsover.R;
import com.example.dsover.bean.Product;
import com.example.dsover.gouwuche.widget.AddDecreaseView;
import com.example.dsover.utils.StringUtils;

import java.util.List;

/**
 * Created by 红鼻子小黑 on 2018/10/25.
 */

public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ViewHolder>{
    private Context context;
    private List<Product> list;
    public interface OnproductClickListener{
        void onProductClick(int position,boolean isChecked);
    }
    private OnproductClickListener productClickListener;
    public void setOnProductClickListener(OnproductClickListener listener){
        this.productClickListener = listener;
    }

    public interface OnAddDecreaseProductListener{
        void onChange(int position,int num);
    }
    private OnAddDecreaseProductListener productListener;
    public void setOnAddDecreaseProductListener(OnAddDecreaseProductListener listener){
        this.productListener = listener;
    }
    public ProductAdapter(Context context, List<Product> list) {
        this.context = context;
        this.list = list;
    }

    @NonNull
    @Override
    public ProductAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
      View view = View.inflate(context,R.layout.item_product,null);
       ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ProductAdapter.ViewHolder holder, final int position) {
        final Product product = list.get(position);
        String imgs = product.getImages();
        if (!TextUtils.isEmpty(imgs)) {
            String[] strings = imgs.split("\\|");
            if (strings.length > 0) {
                Glide.with(context).load(StringUtils.Http2Http(strings[0]))
                        .into(holder.imgProduct);
            }
        }
            holder.texProductName.setText(product.getTitle());
            holder.txtsinglePriice.setText(String.valueOf(product.getPrice()));
            holder.advProduct.setNum(product.getNum());
            holder.advProduct.setOnAddDecreaseClickListener(new AddDecreaseView.OnAddDecreaseClickListener() {
                @Override
                public void add(int num) {
                    product.setNum(num);
                    if (productListener !=null){
                        productListener.onChange(position,num);
                    }
                }

                @Override
                public void decrease(int num) {
                    product.setNum(num);
                    if (productListener !=null){
                        productListener.onChange(position,num);
                    }
                }
            });
            holder.cbProduct.setOnCheckedChangeListener(null);
            holder.cbProduct.setChecked(product.isChecked());
            holder.cbProduct.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
                    product.setChecked(isChecked);
                    if (productClickListener !=null){
                        productClickListener.onProductClick(position,isChecked);
                    }
                }
            });
        }


    @Override
    public int getItemCount() {
        return list.size();
    }
    class ViewHolder extends RecyclerView.ViewHolder{
        private CheckBox cbProduct;
        private ImageView imgProduct;
        private TextView texProductName;
        private TextView txtsinglePriice;
        private AddDecreaseView advProduct;
        public ViewHolder(View itemView){
            super(itemView);
            cbProduct = itemView.findViewById(R.id.cb_product);
            imgProduct = itemView.findViewById(R.id.img_product);
            texProductName = itemView.findViewById(R.id.txt_product_name);
            txtsinglePriice = itemView.findViewById(R.id.txt_single_price);
            advProduct = itemView.findViewById(R.id.adv_product);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值