目录
商品和商家全选全不选逻辑
首先我们从接口上请求下来一个二级商品列表 需要包含着图片 价格 数量等数据
随后先实现第一个逻辑实现一级列表的全选全不选
//这是全选全不选的点击事件
//设置了总价和总数量
float price = 0;
int numAll = 0;
boolean isChecked = mCheckbox.isChecked();//获取全选框的状态
//吧商家全部选中
for (int i = 0; i < list.size(); i++) {
//给商家的list集合设置为和全选框一样的状态
//这个isChecked需要在bean类里边我们自己设置一个布尔类型的数据
list.get(i).setChecked(isChecked);
//获取商品的集合
List<ShopCarBean.DataBean.ListBean> childlist = this.list.get(i).getList();
for (int j = 0; j < childlist.size(); j++) {//吧商品全部选中
//吧商品的选择框全部给选中
childlist.get(j).setChecked(isChecked);
//获取子类的价格个数量
float p = childlist.get(j).getPrice();
int num = childlist.get(j).getNum();
//获取总价格和总数量
price = price + (p * num);
numAll = numAll + num;
}
}
if (!isChecked){
//在全不选的时候给总价格和总数量归零
price=0.0f;
numAll=0;
}
//吧总数量和总价格展示上去
mTvNum.setText("去结算("+numAll+")");
mTvPrice.setText(price + "");
//吧新的list集合传入到适配器当中
shuJuAdp.setList(list);
商家适配器的接口回调
private ChildListListener childListListener;
//设置对外的方法
public void setChildListListener(ChildListListener childListListener) {
this.childListListener = childListListener;
}
//设置一个接口
public interface ChildListListener {
public void changeList(List<ShopCarBean.DataBean> list);
}
给商家的选择框设置商品的全选全不选
//商家的选择框状态
viewHodel.mCheckbox.setChecked(list.get(i).isChecked());
//商家选择框的点击事件
viewHodel.mCheckbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取商家的选择框状态
boolean ischecked = viewHodel.mCheckbox.isChecked();
吧商家选择框的状态设置上去
list.get(i).setChecked(ischecked);
//获取商品集合
List<ShopCarBean.DataBean.ListBean> listchild = ShuJuAdp.this.list.get(i).getList();
//给商品选择状态全部选中
for (int j = 0; j < listchild.size(); j++) {
//吧商品集合的选择框设置成商家选择框一样的状态
listchild.get(j).setChecked(ischecked);
}
//刷新条目
notifyItemChanged(i);
//接口回调吧新的list转给子类适配器
//这个方法在MainActivity中调用
childListListener.changeList(list);
}
});
在MainActivity中调用商品的接口
商家全选回调给MainActivity的接口回调吧总价和数量进行联动
shuJuAdp.setChildListListener(new ShuJuAdp.ChildListListener() {
@Override
public void changeList(List<ShopCarBean.DataBean> list) {
//创建一个总价和总数量
float price=0;
int numAll=0;
//循环选中商品的选中状态
for (int i = 0; i <list.size(); i++) {
//获取商品的集合
List<ShopCarBean.DataBean.ListBean> childlist = list.get(i).getList();
for (int j = 0; j <childlist.size() ; j++) {
//判断是否为true
if (childlist.get(j).isChecked()) {
//获取商品的价格和数量
float p = childlist.get(j).getPrice();
int n = childlist.get(j).getNum();
//获取总价和总数
numAll=numAll+n;
price=price+(p*n);
}
}
}
//给总价和总数赋值
mTvNum.setText("去结算("+numAll+")");
mTvPrice.setText(price + "");
}
});
商品适配器里的更改选择框的状态
//商品选择框更改状态的点击事件
viewHodel.mCheckbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取商品选择框的状态
boolean isChecked = viewHodel.mCheckbox.isChecked();
//更改list集合里边的状态
list.get(i).setChecked(isChecked);
//利用接口回调传到MainActivity的接口回调中改变总价和总数
childListListener.changeList(list);
}
});
自定义View中的接口回调在商品适配器中调用
viewHodel.shopCarAddView.setGaiBianShuLiang(new ShopCarAddView.GaiBianShuLiang() {
@Override
public void num(int num) {
//改变商品的数量然后把list集合传输给MainActivity中的更改总价和总数
list.get(i).setNum(num);
childListListener.changeList(list);
}
});
自定义View中的总代码
public class ShopCarAddView extends RelativeLayout implements View.OnClickListener {
private TextView nums;
//代码里边实例化
public ShopCarAddView(Context context) {
super(context);
init(context);
}
//布局里面引入
public ShopCarAddView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private Context context;
private void init(Context context) {
//toast需要用到的上下文获取
this.context=context;
//引入布局
View view=View.inflate(context, R.layout.zidingyiview,null);
//获取数量
nums = view.findViewById(R.id.ed_text);
//给加减设置点击事件
view.findViewById(R.id.tv_jia).setOnClickListener(this);
view.findViewById(R.id.tv_jian).setOnClickListener(this);
//添加view
addView(view);
}
public void setNum(int num) {
nums.setText(num+"");
}
@Override
public void onClick(View v) {
//判断点击事件是加还是减
switch (v.getId()){
//增加数量的点击事件
case R.id.tv_jia:
//获取目前的条目数量
String numjia = nums.getText().toString().trim();
//给他强转成int类型的数据
int njia = Integer.parseInt(numjia);
//给数量增加
njia++;
//传输给更改数量的接口回调 在商品适配器中调用此方法
gaiBianShuLiang.num(njia);
//吧商品数量更改上去
nums.setText(njia+"");
break;
case R.id.tv_jian:
String numjian = nums.getText().toString().trim();
int njian = Integer.parseInt(numjian);
if (njian==1) {
Toast.makeText(context, "不可以小于1哦", Toast.LENGTH_SHORT).show();
return;
}
njian--;
gaiBianShuLiang.num(njian);
nums.setText(njian+"");
break;
}
}
//设置接口回调
private GaiBianShuLiang gaiBianShuLiang;
public void setGaiBianShuLiang(GaiBianShuLiang gaiBianShuLiang){
this.gaiBianShuLiang=gaiBianShuLiang;
}
public interface GaiBianShuLiang{
void num(int num);
}
}
设置条目数量的加减改变
viewHodel.shopCarAddView.setGaiBianShuLiang(new ShopCarAddView.GaiBianShuLiang() {
@Override
public void num(int num) {
//更改数量
list.get(i).setNum(num);
//吧刷新完的数据传给商品适配器
childListListener.changeList(list);
}
});
设置商品全选中然后更改商家的选中状态
//调用商品的接口回调
shuJuChildAdp.setChildListListener(new ShuJuChildAdp.ChildListListener() {
@Override
public void changeList(List<ShopCarBean.DataBean.ListBean> listChild) {
//设置一个数量
int num = 0;
//判断商品条目有多少个只要有一个商品条目为选中状态就给数量加1
for (int j = 0; j < listChild.size(); j++) {
if (listChild.get(j).isChecked()) {
num++;
}
}
//如果数量和商品数量一样则给商家的选择框设置为true
if (num == listChild.size()) {
list.get(i).setChecked(true);
} else {
list.get(i).setChecked(false);
}
//刷新当前条目
notifyItemChanged(i);
//吧集合传给MainActivity
childListListener.changeList(list);
}
});
MainActivity总代码
public class MainActivity extends AppCompatActivity implements ConInterface.View, View.OnClickListener {
private ConInterface.Presenter presenter;
private RecyclerView mRecycler;
/**
* 全选
*/
private CheckBox mCheckbox;
/**
* 0.0
*/
private TextView mTvPrice;
/**
* 去结算(0)
*/
private TextView mTvNum;
private RelativeLayout mLayout;
private ShuJuAdp shuJuAdp;
private List<ShopCarBean.DataBean> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
presenter = new Presenter(this);
shuJuAdp = new ShuJuAdp(this);
mRecycler.setAdapter(shuJuAdp);
presenter.toModel();
mCheckbox.setOnClickListener(this);
shuJuAdp.setChildListListener(new ShuJuAdp.ChildListListener() {
@Override
public void changeList(List<ShopCarBean.DataBean> list) {
float price=0;
int numAll=0;
for (int i = 0; i <list.size(); i++) {
List<ShopCarBean.DataBean.ListBean> childlist = list.get(i).getList();
for (int j = 0; j <childlist.size() ; j++) {
if (childlist.get(j).isChecked()) {
Toast.makeText(MainActivity.this, childlist.get(j).isChecked()+"", Toast.LENGTH_SHORT).show();
float p = childlist.get(j).getPrice();
int n = childlist.get(j).getNum();
numAll=numAll+n;
price=price+(p*n);
}
}
}
mTvNum.setText("去结算("+numAll+")");
mTvPrice.setText(price + "");
}
});
}
@Override
public void showView(Object o) {
ShopCarBean shopCarBean = (ShopCarBean) o;
list = shopCarBean.getData();
list.remove(0);
LinearLayoutManager manager = new LinearLayoutManager(this);
mRecycler.setLayoutManager(manager);
shuJuAdp.setList(list);
}
//获取控件
private void initView() {
mRecycler = (RecyclerView) findViewById(R.id.recycler);
mCheckbox = (CheckBox) findViewById(R.id.checkbox);
mTvPrice = (TextView) findViewById(R.id.tv_price);
mTvNum = (TextView) findViewById(R.id.tv_num);
mLayout = (RelativeLayout) findViewById(R.id.layout);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.checkbox:
float price = 0;
int numAll = 0;
boolean isChecked = mCheckbox.isChecked();//获取状态
//全选吧商家和商品全部选中
for (int i = 0; i < list.size(); i++) {
list.get(i).setChecked(isChecked);
List<ShopCarBean.DataBean.ListBean> childlist = this.list.get(i).getList();
for (int j = 0; j < childlist.size(); j++) {
childlist.get(j).setChecked(isChecked);
float p = childlist.get(j).getPrice();
int num = childlist.get(j).getNum();
price = price + (p * num);
numAll = numAll + num;
}
}
if (!isChecked){
price=0.0f;
numAll=0;
}
mTvNum.setText("去结算("+numAll+")");
mTvPrice.setText(price + "");
shuJuAdp.setList(list);
break;
default:
}
}
}
商家适配器总代码
public class ShuJuAdp extends RecyclerView.Adapter<ShuJuAdp.ViewHodel> {
private List<ShopCarBean.DataBean> list = new ArrayList<>();
private Context context;
public ShuJuAdp(Context context) {
this.context = context;
}
public void setList(List<ShopCarBean.DataBean> list) {
this.list = list;
notifyDataSetChanged();
}
@NonNull
@Override
public ShuJuAdp.ViewHodel onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.fuleiitem, null);
ViewHodel viewHodel = new ViewHodel(view);
return viewHodel;
}
@Override
public void onBindViewHolder(@NonNull final ShuJuAdp.ViewHodel viewHodel, final int i) {
viewHodel.name.setText(list.get(i).getSellerName());
LinearLayoutManager manager = new LinearLayoutManager(context);
viewHodel.recyclerChild.setLayoutManager(manager);
ShuJuChildAdp shuJuChildAdp = new ShuJuChildAdp(context, list.get(i).getList());
viewHodel.recyclerChild.setAdapter(shuJuChildAdp);
//子类适配器接口回调
shuJuChildAdp.setChildListListener(new ShuJuChildAdp.ChildListListener() {
@Override
public void changeList(List<ShopCarBean.DataBean.ListBean> listChild) {
int num = 0;
for (int j = 0; j < listChild.size(); j++) {
if (listChild.get(j).isChecked()) {
num++;
}
}
if (num == listChild.size()) {
list.get(i).setChecked(true);
} else {
list.get(i).setChecked(false);
}
notifyItemChanged(i);
childListListener.changeList(list);
}
});
viewHodel.mCheckbox.setChecked(list.get(i).isChecked());
viewHodel.mCheckbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean ischecked = viewHodel.mCheckbox.isChecked();
list.get(i).setChecked(ischecked);
List<ShopCarBean.DataBean.ListBean> listchild = ShuJuAdp.this.list.get(i).getList();
for (int j = 0; j < listchild.size(); j++) {
listchild.get(j).setChecked(ischecked);
}
notifyItemChanged(i);
//吧新的list转给子类适配器
childListListener.changeList(list);
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHodel extends RecyclerView.ViewHolder {
CheckBox mCheckbox;
RecyclerView recyclerChild;
TextView name;
public ViewHodel(@NonNull View itemView) {
super(itemView);
name = (TextView) itemView.findViewById(R.id.tv_name);
recyclerChild = (RecyclerView) itemView.findViewById(R.id.recycler_child);
mCheckbox = (CheckBox) itemView.findViewById(R.id.checkbox);
}
}
private ChildListListener childListListener;
public void setChildListListener(ChildListListener childListListener) {
this.childListListener = childListListener;
}
public interface ChildListListener {
public void changeList(List<ShopCarBean.DataBean> list);
}
}
商品适配器全代码
public class ShuJuChildAdp extends RecyclerView.Adapter<ShuJuChildAdp.ViewHodel> {
private List<ShopCarBean.DataBean.ListBean> list;
private Context context;
public ShuJuChildAdp(Context context, List<ShopCarBean.DataBean.ListBean> list) {
this.context=context;
this.list=list;
}
@NonNull
@Override
public ShuJuChildAdp.ViewHodel onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.childitem, null);
ViewHodel viewHodel=new ViewHodel(view);
return viewHodel;
}
@Override
public void onBindViewHolder(@NonNull final ShuJuChildAdp.ViewHodel viewHodel, final int i) {
viewHodel.mTitle.setText(list.get(i).getTitle());
viewHodel.mPrice.setText(list.get(i).getPrice()+"");
viewHodel.mSimpleDraweeView.setImageURI(list.get(i).getImages());
int num=list.get(i).getNum();
viewHodel.shopCarAddView.setNum(num);
boolean checked = list.get(i).isChecked();
viewHodel.mCheckbox.setChecked(checked);
viewHodel.mCheckbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean isChecked = viewHodel.mCheckbox.isChecked();
list.get(i).setChecked(isChecked);
childListListener.changeList(list);
}
});
viewHodel.shopCarAddView.setGaiBianShuLiang(new ShopCarAddView.GaiBianShuLiang() {
@Override
public void num(int num) {
list.get(i).setNum(num);
childListListener.changeList(list);
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHodel extends RecyclerView.ViewHolder {
TextView mTitle, mPrice;
SimpleDraweeView mSimpleDraweeView;
CheckBox mCheckbox;
private final ShopCarAddView shopCarAddView;
public ViewHodel(@NonNull View itemView) {
super(itemView);
mCheckbox = (CheckBox) itemView.findViewById(R.id.checkbox);
mSimpleDraweeView = (SimpleDraweeView) itemView.findViewById(R.id.simple);
mTitle = (TextView) itemView.findViewById(R.id.tv_title);
mPrice = (TextView) itemView.findViewById(R.id.tv_price);
shopCarAddView = (ShopCarAddView) itemView.findViewById(R.id.addview);
}
}
private ChildListListener childListListener;
public void setChildListListener(ChildListListener childListListener){
this.childListListener=childListListener;
}
public interface ChildListListener{
public void changeList(List<ShopCarBean.DataBean.ListBean> list);
}
}
MainActivity布局全代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".mvp.view.MainActivity"
android:orientation="vertical">
<!--用来展示商家的-->
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/layout"
/>
<RelativeLayout
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
>
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="全选"
android:layout_centerVertical="true"
/>
<TextView
android:layout_toRightOf="@+id/checkbox"
android:id="@+id/tv_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#d43c3c"
android:text="0.0"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
/>
<RelativeLayout
android:layout_width="100dp"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:background="#d43c3c"
>
<TextView
android:id="@+id/tv_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="去结算(0)"
android:textColor="#ffffff"
android:layout_centerInParent="true"
/>
</RelativeLayout>
</RelativeLayout>
</RelativeLayout>
商家布局全代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/checkbox"
android:layout_centerVertical="true"
/>
</RelativeLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_child"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/layout" />
</RelativeLayout>
商品布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_marginTop="10dp">
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true" />
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/simple"
android:layout_width="100dp"
android:layout_height="80dp"
android:layout_toRightOf="@+id/checkbox"
android:layout_centerVertical="true"
/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/simple"
>
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
>
<TextView
android:id="@+id/tv_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#d43c3c" />
<!--自定义加减器-->
<com.example.day13.utils.ShopCarAddView
android:id="@+id/addview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true">
</com.example.day13.utils.ShopCarAddView>
</RelativeLayout>
</RelativeLayout>
</RelativeLayout>
</RelativeLayout>
自定义View的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_jian"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="—"
android:textSize="16sp"
android:padding="5dp"
/>
<TextView
android:id="@+id/ed_text"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:textSize="14sp"
android:gravity="center"
android:layout_toRightOf="@+id/tv_jian"
android:inputType="number"
/>
<TextView
android:id="@+id/tv_jia"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/ed_text"
android:text="+"
android:textSize="16sp"
android:padding="5dp"
/>
</RelativeLayout>
</RelativeLayout>