先加依赖
implementation 'com.android.support:design:27.1.1'
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.11.0'
compile 'com.github.bumptech.glide:glide:3.8.0'
implementation 'com.google.code.gson:gson:2.2.4'
compile 'com.jcodecraeer:xrecyclerview:1.3.2'
//布局文件
Cart布局
<?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="com.bawei.gouwuche.activity.CartActivity">
<com.jcodecraeer.xrecyclerview.XRecyclerView
android:id="@+id/cartGV"
android:layout_above="@+id/cart_bottom_layout"
android:layout_alignParentTop="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<RelativeLayout
android:id="@+id/cart_bottom_layout"
android:padding="5dp"
android:background="@android:color/darker_gray"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:layout_centerVertical="true"
android:id="@+id/allCheckbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/totalpriceTv"
android:textColor="#ffffff"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/allCheckbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="总价:"/>
<Button
android:id="@+id/buy"
android:onClick="buy"
android:layout_alignParentRight="true"
android:text="去结算"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
</RelativeLayout>
package com.bawei.gouwuche.activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;
import com.bawei.gouwuche.R;
import com.bawei.gouwuche.adapter.CartAdapter;
import com.bawei.gouwuche.adapter.CartAllCheckboxListener;
import com.bawei.gouwuche.bean.CartBean;
import com.bawei.gouwuche.common.Constants;
import com.bawei.gouwuche.presenter.CartPesenter;
import com.bawei.gouwuche.view.IcartView;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class CartActivity extends AppCompatActivity implements IcartView, CartAllCheckboxListener {
private XRecyclerView xRecyclerView;
private CartAdapter cartAdapter;
private List<CartBean.DataBean> list;
private CheckBox allCheckbox;
private TextView totalPriceTv;
private int page = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cart);
initView();
initData();
}
/**
* 初始化view
*/
private void initView() {
list = new ArrayList<>();
xRecyclerView = findViewById(R.id.cartGV);
allCheckbox = findViewById(R.id.allCheckbox);
//设置线性布局管理器,listview的列表样式
xRecyclerView.setLayoutManager(new LinearLayoutManager(this));
totalPriceTv = findViewById(R.id.totalpriceTv);
xRecyclerView.setLoadingMoreEnabled(true);//支持加载更多
xRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() {
@Override
public void onRefresh() {//下拉刷新
page = 1;
loadData();//子线程
// xRecyclerView.refreshComplete();
}
@Override
public void onLoadMore() {//加载更多
page++;
loadData();
// xRecyclerView.loadMoreComplete();
}
});
//设置点击事件
allCheckbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (allCheckbox.isChecked()) {//
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
list.get(i).setSelected(true);
for (int i1 = 0; i1 < list.get(i).getList().size(); i1++) {
list.get(i).getList().get(i1).setSelected(true);
}
}
}
} else {
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
list.get(i).setSelected(false);
for (int i1 = 0; i1 < list.get(i).getList().size(); i1++) {
list.get(i).getList().get(i1).setSelected(false);
}
}
}
// totalPrice = 0;
}
cartAdapter.notifyDataSetChanged();//全部刷新
totalPrice();
}
});
}
/**
* 初始化数据
*/
private void initData() {
loadData();
}
/**
* 请求数据
*/
private void loadData() {
HashMap<String, String> params = new HashMap<>();
params.put("uid", "71");
params.put("page",page+"");
CartPesenter cartPesenter = new CartPesenter(this);
cartPesenter.getCarts(params,Constants.GETCARTS);
}
/**
* 刷新购物车列表
*
* @param cartBean
*/
@Override
public void success(CartBean cartBean) {
// TODO: 2018/8/21 展示列表数据
if (cartBean != null && cartBean.getData() != null) {
if (page==1){
list = cartBean.getData();
cartAdapter = new CartAdapter(this, list);
xRecyclerView.setAdapter(cartAdapter);
xRecyclerView.refreshComplete();//把下拉刷新的进度view隐藏掉
}else {
if (cartAdapter!=null){
cartAdapter.addPageData(cartBean.getData());
}
xRecyclerView.loadMoreComplete();//
}
cartAdapter.setCartAllCheckboxListener(this);
}
}
/**
* 失败提示
*
* @param msg
*/
@Override
public void failure(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
/**
* 去结算
*
* @param view
*/
public void buy(View view) {
}
/**
* 全选按钮是否选中的回调
*/
@Override
public void notifyAllCheckboxStatus() {
StringBuilder stringBuilder = new StringBuilder();
if (cartAdapter != null) {
for (int i = 0; i < cartAdapter.getCartList().size(); i++) {
stringBuilder.append(cartAdapter.getCartList().get(i).isSelected());
for (int i1 = 0; i1 < cartAdapter.getCartList().get(i).getList().size(); i1++) {
stringBuilder.append(cartAdapter.getCartList().get(i).getList().get(i1).isSelected());
}
}
}
System.out.println("sb=====" + stringBuilder.toString());
//truetruefalsetruefalse
if (stringBuilder.toString().contains("false")) {
allCheckbox.setChecked(false);
// totalPrice = 0;
} else {
allCheckbox.setChecked(true);
}
totalPrice();//计算总价
}
/**
* 计算总价
*/
private void totalPrice() {
double totalPrice = 0;
for (int i = 0; i < cartAdapter.getCartList().size(); i++) {
for (int i1 = 0; i1 < cartAdapter.getCartList().get(i).getList().size(); i1++) {
//计算总价的关键代码块
if (cartAdapter.getCartList().get(i).getList().get(i1).isSelected()) {
CartBean.DataBean.ListBean listBean = cartAdapter.getCartList().get(i).getList().get(i1);
totalPrice += listBean.getBargainPrice() * listBean.getTotalNum();
}
}
}
totalPriceTv.setText("总价:¥"+totalPrice);
}
}
adapter
package as.bwei.com.gouwuche.adapter;
public interface CartCheckListener {
void notifyParent();//通知父adapter刷新适配器
}
package as.bwei.com.gouwuche.adapter;
public interface CartAllCheckboxListener {
void notifyAllCheckboxStatus();//通知购物车首页,全选反选按钮是否选中
}
package as.bwei.com.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.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;
import java.util.List;
import as.bwei.com.gouwuche.R;
import as.bwei.com.gouwuche.bean.CartBean;
/**
* Author:kson
* E-mail:19655910@qq.com
* Time:2018/08/21
* Description:
*/
public class CartAdapter extends RecyclerView.Adapter<CartAdapter.CartViewHolder> implements CartCheckListener {
private Context mContext;
private List<CartBean.DataBean> cartList;
private CartAllCheckboxListener allCheckboxListener;
public CartAdapter(Context context, List<CartBean.DataBean> list) {
mContext = context;
cartList = list;
}
public void addPageData(List<CartBean.DataBean> list){
if (cartList!=null){
cartList.addAll(list);
notifyDataSetChanged();
}
}
//暴露给购物车页面进行回调
public void setCartAllCheckboxListener(CartAllCheckboxListener cartAllCheckboxListener) {
allCheckboxListener = cartAllCheckboxListener;
}
@NonNull
@Override
public CartViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(mContext).inflate(R.layout.cart_item_layout, parent, false);
CartViewHolder viewHolder = new CartViewHolder(itemView);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull final CartViewHolder holder, final int position) {
final CartBean.DataBean bean = cartList.get(position);
holder.nameTv.setText(bean.getSellerName());
holder.checkBox.setChecked(bean.isSelected());//根据bean对象的ischecked属性,动态设置选中状态
// System.out.println("ischecked:" + bean.isChecked());
// holder.checkBox.setChecked(bean.isChecked());
holder.productXRV.setLayoutManager(new LinearLayoutManager(mContext));
final ProductAdapter productAdapter = new ProductAdapter(mContext, bean.getList());
holder.productXRV.setAdapter(productAdapter);
productAdapter.setCheckListener(this);
for (int i = 0; i < bean.getList().size(); i++) {
if (!bean.getList().get(i).isSelected()){
holder.checkBox.setChecked(false);
break;//跳出循环
}else{
holder.checkBox.setChecked(true);
}
}
//设置商家的checkbox点击事件,逻辑:勾选则子列表全部勾选,取消则全部取消
holder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (holder.checkBox.isChecked()){
bean.setSelected(true);
for (int i = 0; i < bean.getList().size(); i++) {
bean.getList().get(i).setSelected(true);
}
}else{
bean.setSelected(false);
for (int i = 0; i < bean.getList().size(); i++) {
bean.getList().get(i).setSelected(false);
}
}
notifyDataSetChanged();
if (allCheckboxListener!=null){
allCheckboxListener.notifyAllCheckboxStatus();
}
}
});
}
/**
* 暴露修改之后的最新的集合数据
* @return
*/
public List<CartBean.DataBean> getCartList() {
return cartList;
}
@Override
public int getItemCount() {
return cartList.size() == 0 ? 0 : cartList.size();
}
/**
* 刷新适配器的回调
*/
@Override
public void notifyParent() {
notifyDataSetChanged();
if (allCheckboxListener!=null){
allCheckboxListener.notifyAllCheckboxStatus();
}
}
// @Override
// public void notifyParent() {
// notifyDataSetChanged();
// }
public class CartViewHolder extends RecyclerView.ViewHolder {
private CheckBox checkBox;
private TextView nameTv;
private RecyclerView productXRV;
public CartViewHolder(View itemView) {
super(itemView);
checkBox = (CheckBox) itemView.findViewById(R.id.sellerCheckbox);
nameTv = (TextView) itemView.findViewById(R.id.sellerNameTv);
productXRV = (RecyclerView) itemView.findViewById(R.id.productXRV);
}
}
}
cart_item_layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="wrap_content">
<LinearLayout
android:padding="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<CheckBox
android:id="@+id/sellerCheckbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/sellerNameTv"
android:text="商家"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#999999"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/productXRV"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
子列表适配器和布局
package as.bwei.com.gouwuche.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import java.util.List;
import as.bwei.com.gouwuche.R;
import as.bwei.com.gouwuche.bean.CartBean;
import as.bwei.com.gouwuche.widget.MyJIaJianView;
/**
* Author:kson
* E-mail:19655910@qq.com
* Time:2018/08/21
* Description:
*/
public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.CartViewHolder> {
private Context mContext;
private List<CartBean.DataBean.ListBean> listBeanList;
private CartCheckListener checkListener;//接口回调引用
private CartAllCheckboxListener cartAllCheckboxListener;
public ProductAdapter(Context context, List<CartBean.DataBean.ListBean> list) {
mContext = context;
listBeanList = list;
}
/**
* 暴露给调用者去进行回调:对checklisener进行初始化
* @param checkListener
*/
public void setCheckListener(CartCheckListener checkListener) {
this.checkListener = checkListener;
}
public void setCartAllCheckboxListener(CartAllCheckboxListener cartAllCheckboxListener) {
this.cartAllCheckboxListener = cartAllCheckboxListener;
}
@NonNull
@Override
public CartViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(mContext).inflate(R.layout.product_item_layout, parent, false);
CartViewHolder viewHolder = new CartViewHolder(itemView);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull final CartViewHolder holder, int position) {
final CartBean.DataBean.ListBean bean = listBeanList.get(position);
holder.priceTv.setText("优惠价:¥" + bean.getBargainPrice());
holder.titleTv.setText(bean.getTitle());
String[] imgs = bean.getImages().split("\\|");//分割images,得到图片数组
//校验数组大小是否>0,防止空指针
if (imgs != null && imgs.length > 0) {
Glide.with(mContext).load(imgs[0]).into(holder.productIv);
} else {
holder.productIv.setImageResource(R.mipmap.ic_launcher);
}
holder.checkBox.setChecked(bean.isSelected());
holder.myJIaJianView.setNumEt(bean.getTotalNum());
holder.myJIaJianView.setJiaJianListener(new MyJIaJianView.JiaJianListener() {
@Override
public void getNum(int num) {
bean.setTotalNum(num);
if (checkListener!=null){
checkListener.notifyParent();//通知一级列表适配器刷新
}
}
});
holder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (holder.checkBox.isChecked()) {//选中
bean.setSelected(true);
} else {//非选中
bean.setSelected(false);
}
if (checkListener!=null){
checkListener.notifyParent();//通知一级列表适配器刷新
}
}
});
}
@Override
public int getItemCount() {
return listBeanList.size() == 0 ? 0 : listBeanList.size();
}
public class CartViewHolder extends RecyclerView.ViewHolder {
private CheckBox checkBox;
private TextView titleTv, priceTv;
private ImageView productIv;
private MyJIaJianView myJIaJianView;
public CartViewHolder(View itemView) {
super(itemView);
checkBox = (CheckBox) itemView.findViewById(R.id.productCheckbox);
titleTv = (TextView) itemView.findViewById(R.id.title);
priceTv = (TextView) itemView.findViewById(R.id.price);
productIv = (ImageView) itemView.findViewById(R.id.product_icon);
myJIaJianView = (MyJIaJianView) itemView.findViewById(R.id.jiajianqi);
}
}
}
product_item_layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="wrap_content">
<LinearLayout
android:padding="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:orientation="horizontal">
<CheckBox
android:id="@+id/productCheckbox"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ImageView
android:src="@mipmap/ic_launcher"
android:id="@+id/product_icon"
android:layout_width="80dp"
android:layout_height="80dp"/>
</LinearLayout>
<LinearLayout
android:layout_marginLeft="10dp"
android:layout_width="match_parent"
android:layout_gravity="center"
android:layout_height="wrap_content" android:orientation="vertical">
<TextView
android:id="@+id/title"
android:text="商品标题"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<RelativeLayout
android:layout_marginTop="15dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/price"
android:layout_alignParentLeft="true"
android:text="优惠价:¥99.99"
android:textColor="@android:color/holo_red_light"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<com.bawei.gouwuche.widget.MyJIaJianView
android:id="@+id/jiajianqi"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#999999"/>
</LinearLayout>