android自定义view实现购物车数量选取

首先感谢ljp345775博主的这篇文章(android 自定义组合控件并实现点击事件),有兴趣可以去看看,
在这里插入图片描述

1、控件布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/switch_number_reduce"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="-" />

    <TextView
        android:id="@+id/switch_number_show"
        android:layout_width="40dp"
        android:layout_height="wrap_content"
        android:background="@color/color_E9EDF0"
        android:paddingLeft="15dp"
        android:gravity="center"
        android:paddingRight="15dp"
        android:text="1" />

    <TextView
        android:id="@+id/switch_number_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="+" />

</LinearLayout>
    <color name="color_E9EDF0">#E9EDF0</color>

2、具体代码实现

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;

/**
 * User: wangyn
 * Date: 2020/5/21 16:19
 * Description:商品数量调节组合控件 主要控制最少选取以及最大选取(库存)
 */
public class SwitchNumber extends LinearLayout implements View.OnClickListener {


    private Context context;
    //默认最小值 最大值
    private int minimum = 1;//最小选取
    private int maximum = 99;//最大选取,可以是0 库存
    private int showNumber = 1;//默认显示 1

    private I_GetNumber iGetNumber;
    private final TextView switch_number_show;

    public SwitchNumber(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.context = context;

        LayoutInflater.from(context).inflate(R.layout.view_switch_number, this, true);

        TextView switch_number_reduce = findViewById(R.id.switch_number_reduce);
        switch_number_show = findViewById(R.id.switch_number_show);
        TextView switch_number_add = findViewById(R.id.switch_number_add);

        switch_number_show.setText(String.valueOf(showNumber));
        switch_number_reduce.setOnClickListener(this);
        switch_number_add.setOnClickListener(this);

    }

    //设置当前购物车商品数量
    public void setShowNumber(int showNumber) {
        this.showNumber = showNumber;
        switch_number_show.setText(String.valueOf(this.showNumber));
    }

    //库存 可以是0
    public void setMaximum(int maximum) {
        this.maximum = maximum;
//        if (maximum == 0) {
//            switch_number_show.setText(String.valueOf(maximum));
//        }
    }

    public void setiGetNumber(I_GetNumber iGetNumber) {
        this.iGetNumber = iGetNumber;
    }

    @Override
    public void onClick(View v) {

        //库存为0的情况下不可以操作
        if (maximum == 0) {
            Toast.makeText(context, "缺货中", Toast.LENGTH_SHORT).show();
            return;
        }
        int number = Integer.parseInt(switch_number_show.getText().toString());
        switch (v.getId()) {
            case R.id.switch_number_reduce:
                if (minimum == number) {
                    Toast.makeText(context, "最少购买1件商品", Toast.LENGTH_SHORT).show();
                    return;
                }
                number -= 1;
                switch_number_show.setText(String.valueOf(number));
                if (null != iGetNumber) {
                    iGetNumber.getNumber(number);
                }
                break;

            case R.id.switch_number_add:
                if (maximum <= number) {
                    Toast.makeText(context, "最多购买" + maximum + "商品", Toast.LENGTH_SHORT).show();
                    return;
                }
                number += 1;
                switch_number_show.setText(String.valueOf(number));
                if (null != iGetNumber) {
                    iGetNumber.getNumber(number);
                }
                break;
        }
    }

    //定义接口 返回最终数量 用以计算价格
    public interface I_GetNumber {
        void getNumber(int number);
    }
}

3、布局文件中应用

<?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="wrap_content"
    android:layout_marginTop="10dp"
    android:background="@color/color_FFFFFF"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:paddingTop="10dp"
    android:paddingBottom="10dp">

    <ImageView
        android:id="@+id/item_goods_selector"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="15dp"
        android:src="@mipmap/ic_shopping_cart_un" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/item_goods_image"
            android:layout_width="100dp"
            android:layout_height="80dp"
            android:src="@mipmap/ic_default_img" />

        <TextView
            android:id="@+id/item_goods_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/item_goods_image"
            android:ellipsize="end"
            android:maxLines="1"
            android:text="商品标题" />

        <TextView
            android:id="@+id/item_goods_info"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/item_goods_title"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="10dp"
            android:layout_toRightOf="@+id/item_goods_image"
            android:ellipsize="end"
            android:maxLines="1"
            android:text="商品规格信息查看" />

        <TextView
            android:id="@+id/item_goods_price"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/item_goods_info"
            android:layout_toRightOf="@+id/item_goods_image"
            android:text="¥112"
            android:textColor="@color/color_FF0000" />

        <com.qingsen.jinyuantang.views.SwitchNumber
            android:id="@+id/item_goods_switch_number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentBottom="true" />

    </RelativeLayout>

</LinearLayout>

3、适配器中使用

import android.content.Context;
import android.util.Log;
import android.widget.ImageView;

import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.qingsen.jinyuantang.R;
import com.qingsen.jinyuantang.ui.shop.bean.GoodsBean;
import com.qingsen.jinyuantang.views.SwitchNumber;

import java.util.HashMap;
import java.util.List;

/**
 * User: wangyn
 * Date: 2020/5/21 10:50
 * Description: 购物车适配器
 */
public class ShoppingCartAdapter extends BaseQuickAdapter<GoodsBean, BaseViewHolder> {

    private Context context;
    private HashMap<Integer, GoodsBean> hashMap = new HashMap<>();//单选、多选数据保存

    public ShoppingCartAdapter(List<GoodsBean> data, Context context) {
        super(R.layout.item_shopping_cart, data);
        this.context = context;
    }

    @Override
    protected void convert(BaseViewHolder baseViewHolder, GoodsBean goodsBean) {
        int layoutPosition = baseViewHolder.getLayoutPosition();
        ImageView imageView = baseViewHolder.getView(R.id.item_goods_selector);
        GoodsBean bean = hashMap.get(layoutPosition);
        imageView.setImageResource(null != bean ? R.mipmap.ic_shopping_cart : R.mipmap.ic_shopping_cart_un);
		//数量选取控件应用
        SwitchNumber switchNumber = baseViewHolder.getView(R.id.item_goods_switch_number);
        switchNumber.setMaximum(layoutPosition);//设置库存数量
        switchNumber.setiGetNumber(new SwitchNumber.I_GetNumber() {
            @Override
            public void getNumber(int number) {
                Log.e("TAG", "getNumber: " + number);
                //这里 要修改购物车产品数量属性 不然滑动的话会数据错乱
            }
        });
    }

    //多选、复选删除、再次选择
    public void multipleChoice(int position, GoodsBean bean) {
        GoodsBean goodsBean = hashMap.get(position);
        if (null != goodsBean) {
            hashMap.remove(position);
        } else {
            hashMap.put(position, bean);
        }
        notifyDataSetChanged();
    }

    //单选 复选删除 再次选择
    public void singleChoice(int position, GoodsBean goodsBean) {
        hashMap.clear();
        hashMap.put(position, goodsBean);
        notifyDataSetChanged();
    }
}

5、没了就这些 ,没怎么测试,有BUG的话再改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值