1.主布局
http://172.17.8.100/ks/product/getCarts?uid=51
mainactivity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".MainActivity"
android:orientation="vertical"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/rec"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="9"
></android.support.v7.widget.RecyclerView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
>
<CheckBox
android:id="@+id/checkall"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:text="全选/反选"
/>
<TextView
android:id="@+id/price"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="总价"
/>
<Button
android:id="@+id/qjs_btn"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="去结算"
/>
</LinearLayout>
</LinearLayout>
2.商家布局
groupitem.xml
<?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:orientation="vertical"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<CheckBox
android:id="@+id/group_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/group_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我是商家1"
android:layout_marginLeft="10dp"
/>
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/childrec"
android:layout_marginLeft="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
3.商品布局
childitem.xml
<?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:orientation="horizontal"
>
<CheckBox
android:id="@+id/child_checkbox"
android:layout_width="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="30dp"
android:layout_height="wrap_content" />
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/child_img"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginLeft="10dp"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView
android:id="@+id/child_name"
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="锤子"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<TextView
android:layout_marginTop="10dp"
android:id="@+id/child_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="价格:"
/>
<com.example.yuemoni4.MyView
android:id="@+id/myviews"
android:layout_marginLeft="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></com.example.yuemoni4.MyView>
</LinearLayout>
</LinearLayout>
</LinearLayout>
4.自定义加减器布局
myviewitem.xml
<?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="match_parent"
android:orientation="horizontal"
>
<Button
android:id="@+id/myview_add"
android:layout_width="30dp"
android:layout_height="wrap_content"
android:text="+"
/>
<EditText
android:id="@+id/myview_num"
android:layout_width="30dp"
android:layout_height="wrap_content" />
<Button
android:id="@+id/myview_jian"
android:layout_width="30dp"
android:layout_height="wrap_content"
android:text="-"
/>
</LinearLayout>
5.定义MyView类
MyView
public class MyView extends LinearLayout {
private Button myview_add,myview_jian;
private EditText myview_num;
private List<ShopBean.DataBean.ListBean> childlist;
private ChildAdapter childAdapter;
//定义数量的变化值
private int nums;
private int i;
public MyView(Context context) {
super(context);
}
public MyView(final Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.myviewitem,this);
myview_add=findViewById(R.id.myview_add);
myview_jian=findViewById(R.id.myview_jian);
myview_num=findViewById(R.id.myview_num);
//设置add的点击事件 点击add改变num的值
myview_add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//点击add 数量+1
nums++;
//将变化的值设置给输入框
myview_num.setText(nums+"");
//给子条目设置变化值
childlist.get(i).setNum(nums);
//接口调用
if(myViewListener!=null){
myViewListener.onMyView();
}
childAdapter.notifyDataSetChanged();
}
});
//设置jian的点击事件 点击jian改变nums的值
myview_jian.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//进行判断 如果num<=1则提示不能再减了
if(nums<=1){
Toast.makeText(context, "不能再减了", Toast.LENGTH_SHORT).show();
}else {
nums--;
myview_num.setText(nums+"");
childlist.get(i).setNum(nums);
if(myViewListener!=null){
myViewListener.onMyView();
}
childAdapter.notifyDataSetChanged();
}
}
});
}
public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setData(ChildAdapter childAdapter, List<ShopBean.DataBean.ListBean> childlist, int i) {
this.childAdapter=childAdapter;
this.childlist=childlist;
this.i=i;
nums= childlist.get(i).getNum();
myview_num.setText(childlist.get(i).getNum()+"");
}
//定义接口为了方便商品适配器来调取
public interface onMyViewListener{
void onMyView();
}
onMyViewListener myViewListener;
public void setMyViewListener(onMyViewListener myViewListener) {
this.myViewListener = myViewListener;
}
}
6.商品适配器
ChildAdapter
public class ChildAdapter extends RecyclerView.Adapter<ChildAdapter.ViewHolder> {
private Context context;
private List<ShopBean.DataBean.ListBean> childlist;
public ChildAdapter(Context context, List<ShopBean.DataBean.ListBean> childlist) {
this.context = context;
this.childlist = childlist;
}
@NonNull
@Override
public ChildAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.childitem, viewGroup, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ChildAdapter.ViewHolder viewHolder, final int i) {
viewHolder.child_checkbox.setChecked(childlist.get(i).isChildChecked());
viewHolder.child_name.setText(childlist.get(i).getTitle());
viewHolder.child_price.setText(childlist.get(i).getPrice()+"");
AbstractDraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(childlist.get(i).getImages())
.build();
viewHolder.child_img.setController(controller);
//调用自定义view加减器内的方法为了获取每个商品条目中的商品个数
viewHolder.myviews.setData(this,childlist,i);
//调取自定义view的监听事件接口
viewHolder.myviews.setMyViewListener(new MyView.onMyViewListener() {
@Override
public void onMyView() {
if(childListener!=null){
childListener.onChild();
}
}
});
//子条目复选框状态变化 商家复选框也会跟随变化
//点击子条目复选框获取到选中状态,进行调用 方便商家适配器调用
viewHolder.child_checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
childlist.get(i).setChildChecked(isChecked);
if(childListener!=null){
childListener.onChild();
}
}
});
}
@Override
public int getItemCount() {
return childlist.size();
}
//设置循环遍历商品的选中状态
public void setChecked(boolean checked){
for (int i = 0; i <childlist.size() ; i++) {
childlist.get(i).setChildChecked(checked);
}
notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private CheckBox child_checkbox;
private SimpleDraweeView child_img;
private TextView child_name;
private TextView child_price;
private MyView myviews;
public ViewHolder(@NonNull View itemView) {
super(itemView);
child_checkbox=itemView.findViewById(R.id.child_checkbox);
child_img=itemView.findViewById(R.id.child_img);
child_name=itemView.findViewById(R.id.child_name);
child_price=itemView.findViewById(R.id.child_price);
myviews=itemView.findViewById(R.id.myviews);
}
}
//定义商品的接口 方便在商家适配器里面调取
public interface onChildListener{
void onChild();
}
onChildListener childListener;
public void setChildListener(onChildListener childListener) {
this.childListener = childListener;
}
}
7.商家的适配器
GroupAdapter
public class GroupAdapter extends RecyclerView.Adapter<GroupAdapter.ViewHolder> {
private Context context;
private List<ShopBean.DataBean> grouplist;
public GroupAdapter(Context context, List<ShopBean.DataBean> grouplist) {
this.context = context;
this.grouplist = grouplist;
}
@NonNull
@Override
public GroupAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.groupitem, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull final GroupAdapter.ViewHolder viewHolder, final int i) {
//获取商家数据
viewHolder.group_checkbox.setChecked(grouplist.get(i).isGroupChecked());
viewHolder.group_name.setText(grouplist.get(i).getSellerName());
//调取子布局条目
final List<ShopBean.DataBean.ListBean> childlist = grouplist.get(i).getList();
//设置子条目适配器
final ChildAdapter childAdapter = new ChildAdapter(context, childlist);
viewHolder.childrec.setAdapter(childAdapter);
//设置布局
viewHolder.childrec.setLayoutManager(new LinearLayoutManager(context));
//商品控制商家
//点击内部商品的复选框状态控制商家的复选框状态
//当商品的复选框为全部选中 改变商家的复选框状态值
childAdapter.setChildListener(new ChildAdapter.onChildListener() {
@Override
public void onChild() {
if(groupListener!=null){
groupListener.onGroup(grouplist);
}
//设置默认为true
boolean isChecked=true;
//进行循环遍历商品
for (int j = 0; j <childlist.size() ; j++) {
//获取商品条目的状态值
boolean childChecked = childlist.get(j).isChildChecked();
//进行判断状态值 如果未选中,将状态设置未false
if(!childChecked){
isChecked=false;
break;
}
}
//设置商家复选框的值
viewHolder.group_checkbox.setChecked(isChecked);
//获取商家的条目进行设置状态值
grouplist.get(i).setGroupChecked(isChecked);
}
});
//商家控制商品 的点击事件
//点击商家
viewHolder.group_checkbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击商家设置状态
viewHolder.group_checkbox.setChecked(viewHolder.group_checkbox.isChecked());
//控制商品
childAdapter.setChecked(viewHolder.group_checkbox.isChecked());
}
});
}
@Override
public int getItemCount() {
return grouplist.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView group_name;
private CheckBox group_checkbox;
private RecyclerView childrec;
public ViewHolder(@NonNull View itemView) {
super(itemView);
group_name=itemView.findViewById(R.id.group_name);
group_checkbox=itemView.findViewById(R.id.group_checkbox);
childrec=itemView.findViewById(R.id.childrec);
}
}
//设置商家的接口 为了在主页面调取数据用
public interface onGroupListener{
void onGroup(List<ShopBean.DataBean> data);
}
onGroupListener groupListener;
public void setGroupListener(onGroupListener groupListener) {
this.groupListener = groupListener;
}
}
8.主页面全选反选
Mainactivity
public class MainActivity extends AppCompatActivity implements IShopView {
@BindView(R.id.rec)
RecyclerView rec;
@BindView(R.id.price)
TextView price;
@BindView(R.id.qjs_btn)
Button qjsBtn;
@BindView(R.id.checkall)
CheckBox checkall;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
//连接p层
ShopPresenter shopPresenter = new ShopPresenter(this);
shopPresenter.getShopPresenter();
//设置布局
rec.setLayoutManager(new LinearLayoutManager(this));
}
@Override
public void getShopView(ShopBean shopBean) {
//设置适配器
//获取商家条目
final List<ShopBean.DataBean> grouplist = shopBean.getData();
//删除第一条商家所有数据
grouplist.remove(0);
final GroupAdapter groupAdapter = new GroupAdapter(this, grouplist);
rec.setAdapter(groupAdapter);
//进行全选反选
//点击全选的点击事件
checkall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//定义一个变化的总价
int sumPrice=0;
//获取复选框选中的状态
boolean b = ((CheckBox) v).isChecked();
//进行判断
//如果全选
if(b){
//进行循环遍历商家的复选框
for (int i = 0; i <grouplist.size() ; i++) {
//将全部的商家复选框设置为true
grouplist.get(i).setGroupChecked(true);
//获取商品
List<ShopBean.DataBean.ListBean> childlist = grouplist.get(i).getList();
//进行遍历商品
for (int j = 0; j <childlist.size() ; j++) {
//将全部的商品复选框状态设置为true
childlist.get(j).setChildChecked(true);
//计算总价
sumPrice += childlist.get(j).getPrice()*childlist.get(j).getNum();
}
}
}else {
//进行反选
//进行遍历商家的复选框
for (int i = 0; i <grouplist.size() ; i++) {
grouplist.get(i).setGroupChecked(false);
List<ShopBean.DataBean.ListBean> childlist = grouplist.get(i).getList();
for (int j = 0; j <childlist.size() ; j++) {
childlist.get(j).setChildChecked(false);
}
}
}
groupAdapter.notifyDataSetChanged();
price.setText("总价"+sumPrice+"");
}
});
//商品和商家控制全选反选
groupAdapter.setGroupListener(new GroupAdapter.onGroupListener() {
@Override
public void onGroup(List<ShopBean.DataBean> data) {
int sumPrice=0;
//将状态值默认设置为true
boolean isChecked=true;
//循环遍历商家条目
for (int i = 0; i <grouplist.size() ; i++) {
//获取子条目
List<ShopBean.DataBean.ListBean> childlist = grouplist.get(i).getList();
//循环遍历子条目
for (int j = 0; j <childlist.size() ; j++) {
if(childlist.get(j).isChildChecked()){
sumPrice += childlist.get(j).getPrice()*childlist.get(j).getNum();
}else {
isChecked=false;
}
}
}
//点击全选为选中
checkall.setChecked(isChecked);
//修改值
price.setText("总价"+sumPrice+"");
}
});
}
}