首先感谢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的话再改