**
MianActivity页面
**
package com.example.myapplication.activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import com.example.myapplication.R;
import com.example.myapplication.adapter.CartAdapter;
import com.example.myapplication.bean.CartBean;
import com.example.myapplication.callback.CartUICallback;
import com.example.myapplication.contract.CartContract;
import com.example.myapplication.presenter.CartPresenter;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class MainActivity extends AppCompatActivity implements CartContract.cartView,CartUICallback,XRecyclerView.LoadingListener {
private XRecyclerView xRecyclerView;
private CheckBox checkBox;
private CartPresenter cartPresenter;
private CartAdapter cartAdapter;
private List<CartBean.Cart> carts;
private int page = 1;
private HashMap<String,String> params;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initData(){
//实例化p层
cartPresenter = new CartPresenter(this);
//实例化集合
carts = new ArrayList<>();
requestData();
}
/**
* 请求购物车数据
*/
private void requestData(){
params = new HashMap<>();
params.put("uid","71");
params.put("page",page+"");
cartPresenter.getCarts(params);
}
/**
* 初始化view
*/
private void initView(){
xRecyclerView = findViewById(R.id.xrecy);
checkBox = findViewById(R.id.checkbox);
xRecyclerView.setLoadingListener(this);
xRecyclerView.setLoadingMoreEnabled(true);
xRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//CheckBox的监听
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (b){
//遍历集合
for (CartBean.Cart cart : carts){
cart.isChecked = true;
//遍历集合
for (CartBean.Cart.Product product : cart.list){
product.isProductChecked = true;
}
}
}else {
for (CartBean.Cart cart : carts){
cart.isChecked = false;
for (CartBean.Cart.Product product : cart.list){
product.isProductChecked = false;
}
}
}
//刷新适配器
cartAdapter.notifyDataSetChanged();
getTotalPrice();
}
});
}
@Override
public void success(List<CartBean.Cart> list) {
if (list != null){
carts = list;
for (CartBean.Cart cart : carts){
for (CartBean.Cart.Product product : cart.list){
//设置数量
product.productNum = 1;
}
}
if (page==1){
//刷新
//加载完成,隐藏头尾加载进度布局
xRecyclerView.refreshComplete();
cartAdapter = new CartAdapter(carts, this);
cartAdapter.setCartUICallback(this);
xRecyclerView.setAdapter(cartAdapter);
}else {
//上拉
if (cartAdapter==null){
cartAdapter = new CartAdapter(carts,this);
cartAdapter.setCartUICallback(this);
xRecyclerView.setAdapter(cartAdapter);
}else {
cartAdapter.addData(list);
}
xRecyclerView.loadMoreComplete();
}
}
}
@Override
public void failure(String msg) {
}
/**
* 获取总价
*/
private void getTotalPrice(){
//创建总价的对象
double totalprice = 0;
//遍历所有商品计算总价
for (CartBean.Cart cart : cartAdapter.getCarts()){//得到最新的数据
for (CartBean.Cart.Product product : cart.list){
if (product.isProductChecked){
System.out.println("num"+product.productNum);
//总价
totalprice += product.price*product.productNum;
}
}
}
//设置值
checkBox.setText("¥:" + totalprice);
}
/**
* 通知底部导航栏总价联动
*/
@Override
public void notifyCart() {
getTotalPrice();
}
/**
* 下拉
*/
@Override
public void onRefresh() {
page = 1;
requestData();
}
/**
* 加载更多
*/
@Override
public void onLoadMore() {
page++;
requestData();
}
}
**
mianactivity的布局
**
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView 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"
app:cardElevation="5dp"
app:cardCornerRadius="10dp"
app:cardBackgroundColor="#ffffff"
tools:context=".activity.MainActivity">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.jcodecraeer.xrecyclerview.XRecyclerView
android:layout_width="0dp"
android:layout_height="0dp"
android:id="@+id/xrecy"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@id/re"/>
<RelativeLayout
android:id="@+id/re"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="0dp"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkbox"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/price"
android:layout_marginLeft="50dp"
android:textSize="18sp"
android:layout_alignRight="@id/price"
android:layout_centerVertical="true"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/but_js"
android:text="去结算"
android:layout_alignParentRight="true"
android:background="#ff3"
/>
</RelativeLayout>
</android.support.constraint.ConstraintLayout>
</android.support.v7.widget.CardView>
**
Contract契约类
**
package com.example.myapplication.contract;
import com.example.myapplication.bean.CartBean;
import com.example.myapplication.model.CartModelCallback;
import java.util.HashMap;
import java.util.List;
public interface CartContract {
public abstract class cartPresenter{
public abstract void getCarts(HashMap<String,String> params);
}
interface cartModel{
void getCarts(HashMap<String,String> params, CartModelCallback callback);
}
interface cartView{
void success(List<CartBean.Cart> list);
void failure(String msg);
}
}
**
Model层
**
package com.example.myapplication.model;
import android.os.Handler;
import com.example.myapplication.api.UserApi;
import com.example.myapplication.contract.CartContract;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
public class CartModel implements CartContract.cartModel {
Handler handler = new Handler();
@Override
public void getCarts(HashMap<String, String> params, final CartModelCallback callback) {
//日志拦截器
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(loggingInterceptor)
.build();
FormBody.Builder builder = new FormBody.Builder();
for (Map.Entry<String,String> map : params.entrySet()){
builder.add(map.getKey(),map.getValue());
}
Request request = new Request.Builder().post(builder.build()).url(UserApi.BASE_URL)
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if (callback!=null){
handler.post(new Runnable() {
@Override
public void run() {
callback.failure("网络异常");
}
});
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String result = response.body().string();
if (callback!=null){
handler.post(new Runnable() {
@Override
public void run() {
callback.success(result);
}
});
}
}
});
}
}
CartModelCallback页面 model层的接口类
package com.example.myapplication.model;
public interface CartModelCallback {
void success(String result);
void failure(String msg);
}
**
Presenter层
**
package com.example.myapplication.presenter;
import com.example.myapplication.bean.CartBean;
import com.example.myapplication.contract.CartContract;
import com.example.myapplication.model.CartModel;
import com.example.myapplication.model.CartModelCallback;
import com.google.gson.Gson;
import java.util.HashMap;
public class CartPresenter extends CartContract.cartPresenter {
private CartModel cartModel;
private CartContract.cartView cartView;
public CartPresenter(CartContract.cartView cartView) {
cartModel = new CartModel();
this.cartView = cartView;
}
@Override
public void getCarts(HashMap<String, String> params) {
cartModel.getCarts(params, new CartModelCallback() {
@Override
public void success(String result) {
CartBean cartBean = new Gson().fromJson(result,CartBean.class);
cartView.success(cartBean.data);
}
@Override
public void failure(String msg) {
cartView.failure(msg);
}
});
}
}
**
自定义view ,加减页面
**
package com.example.myapplication.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.example.myapplication.R;
public class AddMinusView extends LinearLayout {
private TextView addTv,minusTv;
private EditText numTv;
private int num = 1;
public AddMinusView(Context context) {
this(context,null);
}
public AddMinusView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public AddMinusView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context){
//获取布局
View view = LayoutInflater.from(context).inflate(R.layout.add_minus_layout,this,true);
//获取资源ID
addTv = view.findViewById(R.id.add);
minusTv = view.findViewById(R.id.minus);
numTv = view.findViewById(R.id.et_num);
numTv.setText("1");
//添加的点击事件
addTv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
num++;
numTv.setText(num+"");
if (addMinusCallback!=null){
addMinusCallback.numCallback(num);
}
}
});
minusTv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
num--;
if (num==0){
num=1;
Toast.makeText(getContext(),"不能再减了",Toast.LENGTH_SHORT).show();
}
numTv.setText(num+"");
if (addMinusCallback!=null){
addMinusCallback.numCallback(num);
}
}
});
}
/**
* 设置加速器数量
* @param num 动态
*/
public void setNumTv(int num) {
numTv.setText(num+"");
}
/**
* 获取当前view的数量
* @return
*/
public int getNum() {
return num;
}
private AddMinusCallback addMinusCallback;
public void setAddMinusCallback(AddMinusCallback addMinusCallback) {
this.addMinusCallback = addMinusCallback;
}
//返回总数的接口
public interface AddMinusCallback{
void numCallback(int num);
}
}
**
自定义view的布局
**
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content"
android:layout_height="wrap_content">
<LinearLayout
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<TextView
android:id="@+id/minus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="-"
/>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1"
android:id="@+id/et_num"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/add"
android:padding="10dp"
android:text="+"
/>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
**
一级的Adapter页面
**
package com.example.myapplication.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 com.example.myapplication.R;
import com.example.myapplication.activity.MainActivity;
import com.example.myapplication.bean.CartBean;
import com.example.myapplication.callback.CartCallback;
import com.example.myapplication.callback.CartUICallback;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.List;
public class CartAdapter extends XRecyclerView.Adapter<CartAdapter.MyVh> implements CartCallback {
private List<CartBean.Cart> carts;
private Context context;
/**
* 通知首页的接口
*/
private CartUICallback cartUICallback;
public void setCartUICallback(MainActivity cartUICallback) {
this.cartUICallback = cartUICallback;
}
public CartAdapter(List<CartBean.Cart> carts, Context context) {
this.carts = carts;
this.context = context;
}
public List<CartBean.Cart> getCarts() {
return carts;
}
@NonNull
@Override
public MyVh onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
//获取子布局
View view = LayoutInflater.from(context).inflate(R.layout.cart_item,viewGroup,false);
return new MyVh(view);
}
@Override
public void onBindViewHolder(@NonNull final MyVh myVh, int i) {
//获取下标
final CartBean.Cart cart = carts.get(i);
//设置数据
myVh.textView.setText(cart.sellreName);
myVh.checkBox.setChecked(cart.isChecked);
//对每件商品的pos赋值
for (CartBean.Cart.Product product : cart.list){
product.pos = i;
}
//创建二级适配器实例
ProductAdapter productAdapter = new ProductAdapter(cart.list, context);
productAdapter.setCartCallback(this);
//设置布局管理器
myVh.xRecyclerView.setLayoutManager(new LinearLayoutManager(context));
//绑定适配器
myVh.xRecyclerView.setAdapter(productAdapter);
myVh.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//设置一级对象的选中状态
cart.isChecked = myVh.checkBox.isChecked();
//设置二级对象选中状态
for (CartBean.Cart.Product product : cart.list){
product.isProductChecked = cart.isChecked;
}
//通知刷新
notifyDataSetChanged();
//选中状态改变后,通知首页价格联动
if (cartUICallback!=null){
cartUICallback.notifyCart();
}
}
});
}
@Override
public int getItemCount() {
return carts==null?0:carts.size();
}
@Override
public void notifyCartItem(boolean isChecked, int position) {
//设置一级列表的选中状态
carts.get(position).isChecked = isChecked;
notifyDataSetChanged();
//选中状态改变后,通知主页联动价格
if (cartUICallback!=null){
cartUICallback.notifyCart();
}
}
/**
* 数量改变后,通知首页价格联动
*/
@Override
public void notifyNum() {
if (cartUICallback!=null){
cartUICallback.notifyCart();
}
}
/**
* 加载新的数据,并刷新适配器
* @param list
*/
public void addData(List<CartBean.Cart> list){
if (list!=null&&carts!=null){
carts.addAll(list);
notifyDataSetChanged();
}
}
public class MyVh extends RecyclerView.ViewHolder {
private XRecyclerView xRecyclerView;
private CheckBox checkBox;
private TextView textView;
public MyVh(@NonNull View itemView) {
super(itemView);
//获取资源ID
xRecyclerView = itemView.findViewById(R.id.rv);
checkBox = itemView.findViewById(R.id.checkbox);
textView = itemView.findViewById(R.id.text_names);
}
}
}
**
一级的子布局
**
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:cardElevation="5dp"
app:cardBackgroundColor="#ffffff"
app:cardCornerRadius="10dp"
android:layout_marginTop="10dp"
android:padding="10dp">
<LinearLayout
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:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/checkbox"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="商家名称"
android:id="@+id/text_names"
/>
</LinearLayout>
<com.jcodecraeer.xrecyclerview.XRecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/rv"
/>
</LinearLayout>
`
</android.support.v7.widget.CardView>
**
二级的Adapter页面
**
package com.example.myapplication.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 com.example.myapplication.R;
import com.example.myapplication.bean.CartBean;
import com.example.myapplication.callback.CartCallback;
import com.example.myapplication.widget.AddMinusView;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.List;
public class ProductAdapter extends XRecyclerView.Adapter<ProductAdapter.MyVh> {
private List<CartBean.Cart.Product> carts;
private Context context;
private CartCallback cartCallback;
public void setCartCallback(CartCallback cartCallback) {
this.cartCallback = cartCallback;
}
public ProductAdapter(List<CartBean.Cart.Product> carts, Context context) {
this.carts = carts;
this.context = context;
}
@NonNull
@Override
public MyVh onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.product_item,viewGroup,false);
return new MyVh(view);
}
@Override
public void onBindViewHolder(@NonNull final MyVh myVh, int i) {
//获取下标
final CartBean.Cart.Product product = carts.get(i);
//设置数据
myVh.checkBox.setChecked(product.isProductChecked);
myVh.price.setText("¥:"+product.price);
myVh.textView.setText(product.title);
//设置数量到edittext
myVh.addMinusView.setNumTv(product.productNum);
//设置图片
String[] imgs = product.images.split("\\|");
if (imgs != null && imgs.length > 0){
Glide.with(context).load(imgs[0]).into(myVh.imageView);
}
//设置自定义view的加减刷新
myVh.addMinusView.setAddMinusCallback(new AddMinusView.AddMinusCallback() {
@Override
public void numCallback(int num) {
//对当前商品数量动态改变
product.productNum = num;
//通知一级列表数量改变,刷新数据
if (cartCallback != null){
cartCallback.notifyNum();
}
}
});
//设置二级按钮选中状态
myVh.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
System.out.println("myVh.checkBox.isChecked()"+myVh.checkBox.isChecked());
//一级
if (!myVh.checkBox.isChecked()){
//未选中
product.isProductChecked = false;
//接口不等于空,刷新
if (cartCallback != null){
cartCallback.notifyCartItem(false, product.pos);
}
}else {
//二级已选中
product.isProductChecked = true;
//遍历所有数据
for (CartBean.Cart.Product cart : carts){
//判断集合内商品的选中状态,如果未选中
if (!cart.isProductChecked){
if (cartCallback != null){
cartCallback.notifyCartItem(false,product.pos);
}
break;//跳出循环
}
//如果都选中,设置一级为true
if (cartCallback != null){
cartCallback.notifyCartItem(true, product.pos);
}
}
}
}
});
}
@Override
public int getItemCount() {
return carts==null?0:carts.size();
}
public class MyVh extends RecyclerView.ViewHolder {
private CheckBox checkBox;
private ImageView imageView;
private TextView price,textView;
private AddMinusView addMinusView;
public MyVh(@NonNull View itemView) {
super(itemView);
checkBox = itemView.findViewById(R.id.checkbox);
imageView = itemView.findViewById(R.id.iv_product);
textView = itemView.findViewById(R.id.title);
price = itemView.findViewById(R.id.price);
addMinusView = itemView.findViewById(R.id.addminusView);
}
}
}
**
二级的子布局
**
<?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">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/left_layout"
android:layout_toLeftOf="@+id/addminusView"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:orientation="horizontal">
<CheckBox
android:layout_gravity="center"
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:layout_gravity="center"
android:layout_width="80dp"
android:src="@mipmap/ic_launcher"
android:layout_height="80dp"
android:id="@+id/iv_product"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:text="商品标题商品标题商品标题商品标题商品标题商品标题商品标题商品标题商品标题商品标题商品标题"
android:layout_margin="10dp"
android:lines="2"
android:ellipsize="end"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/price"
android:text="价格"
android:textSize="14sp"
android:textColor="#ff00"
android:layout_margin="10dp"
android:lines="2"
android:ellipsize="end"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
<com.example.myapplication.widget.AddMinusView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/addminusView"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
></com.example.myapplication.widget.AddMinusView>
</RelativeLayout>
</LinearLayout>
**
CartCallback页面
**
package com.example.myapplication.callback;
public interface CartCallback {
//刷新条目
void notifyCartItem(boolean isChecked, int position);
//刷新总数
void notifyNum();
}
**
CartUICallback页面
**
package com.example.myapplication.callback;
public interface CartUICallback {
void notifyCart();
//刷新
}
**
Bean页面
**
package com.example.myapplication.bean;
import java.util.List;
public class CartBean {
public String msg;
public String code;
public List<Cart> data;
public class Cart{
//一级列表是否选中标志位
public boolean isChecked;
public String sellreName;
public String sellerid;
public List<Product> list;
public class Product{
//二级
public boolean isProductChecked;
public String title;
public String images;
public double price;
public String pid;
public int pos;
public int productNum =1;
}
}
}