mvp购物车
activity
package demo.bw.com.shopp.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.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.List;
import demo.bw.com.shopp.R;
import demo.bw.com.shopp.activity.ShopActivity;
import demo.bw.com.shopp.callback.ShopCallback;
import demo.bw.com.shopp.callback.ShopUICallback;
import demo.bw.com.shopp.entity.ShopBean;
public class ShopAdapter extends XRecyclerView.Adapter<ShopAdapter.MyVh> implements ShopCallback {
private Context context;
private List<ShopBean.Shop> shops;
private ShopUICallback shopCallback;
public void setshopCallback(ShopUICallback shopCallback){
this.shopCallback =shopCallback;
}
public ShopAdapter(Context context,List<ShopBean.Shop> shops){
this.context=context;
this.shops=shops;
}
@NonNull
@Override
public ShopAdapter.MyVh onCreateViewHolder( @NonNull ViewGroup viewGroup, int i ) {
View view=LayoutInflater.from(context).inflate(R.layout.activity_shop_item,viewGroup,false);
return new MyVh(view);
}
@Override
public void onBindViewHolder( @NonNull final MyVh myVh, int i ) {
final ShopBean.Shop shop=shops.get(i);
myVh.nameTv.setText(shop.sellerName);
myVh.checkBox.setChecked(shop.isChecked);
for (ShopBean.Shop.Product product:shop.list){
product.pos=i;
}
ProductAdapter productAdapter=new ProductAdapter(context,shop.list);
productAdapter.setshopCallback(this);
myVh.xRecyclerView.setLayoutManager(new LinearLayoutManager(context));
myVh.xRecyclerView.setAdapter(productAdapter);
myVh.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick( View view ) {
shop.isChecked=myVh.checkBox.isChecked();
for (ShopBean.Shop.Product product:shop.list){
product.isProductChecked=shop.isChecked;
}
notifyDataSetChanged();
if (shopCallback!=null){
shopCallback.notifyCart();
}
}
});
}
@Override
public int getItemCount() {
return shops==null? 0 :shops.size();
}
@Override
public void notifyCartItem( boolean isChecked, int postion ) {
shops.get(postion).isChecked=isChecked;
notifyDataSetChanged();
if (shopCallback!=null){
shopCallback.notifyCart();
}
}
@Override
public void notifyNum() {
if (shopCallback!=null){
shopCallback.notifyCart();
}
}
public class MyVh extends RecyclerView.ViewHolder {
private XRecyclerView xRecyclerView;
private CheckBox checkBox;
private TextView nameTv;
public MyVh( @NonNull View itemView ) {
super(itemView);
xRecyclerView = itemView.findViewById(R.id.rv);
checkBox = itemView.findViewById(R.id.checkbox);
nameTv = itemView.findViewById(R.id.name);
}
}
}
接口
public class Api {
public final static String BASE_URL = “http://www.zhaoapi.cn/”;
}
package demo.bw.com.shopp.api;
public class ProductApi {
public final static String CART_URL = Api.BASE_URL+“product/getCarts?uid=71”;
}
callback
ShopCallback
package demo.bw.com.shopp.callback;
public interface ShopCallback {
void notifyCartItem(boolean isChecked ,int postion);
void notifyNum();
}
ShopUICallback
package demo.bw.com.shopp.callback;
public interface ShopUICallback {
void notifyCart();
}
Contract
package demo.bw.com.shopp.contract;
import java.util.HashMap;
import java.util.List;
import demo.bw.com.shopp.model.IShopModelCallback;
import demo.bw.com.shopp.entity.ShopBean;
public interface ShopContract {
public abstract class ShopPresenter{
public abstract void getShops( HashMap<String,String> params );
}
interface ISgopModel{
void getShops( HashMap<String,String> params, IShopModelCallback callback );
}
interface IShopView{
void success( List<ShopBean.Shop> list );
void failure(String msg);
}
}
bean
package demo.bw.com.shopp.entity;
import java.util.List;
public class ShopBean {
public String code;
private String msg;
public List data;
public class Shop{
public boolean isChecked;
public String sellerName;
public String sellerid;
public Listlist;
public class Product{
public boolean isProductChecked;//二级
public String title;
public String images;
public double price;
public String pid;
public int pos;
public int num=1;
}
}
}
model
IShopModel
package demo.bw.com.shopp.model;
import android.os.Handler;
import java.io.IOException;
import java.util.HashMap;
import demo.bw.com.shopp.api.ProductApi;
import demo.bw.com.shopp.contract.ShopContract;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
public class IShopModel implements ShopContract.ISgopModel {
Handler handler=new Handler();
@Override
public void getShops( HashMap<String, String> params, final IShopModelCallback callback ) {
//日志拦截器
HttpLoggingInterceptor interceptor=new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient=new OkHttpClient.Builder().addInterceptor(interceptor).build();
Request request=new Request.Builder().url(ProductApi.CART_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( final 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);
}
});
}
}
});
}
}
IShopModelCallback
package demo.bw.com.shopp.model;
public interface IShopModelCallback {
void success(String result);
void failure(String msg);
}
ShopPresenter
package demo.bw.com.shopp.presenter;
import com.google.gson.Gson;
import java.util.HashMap;
import demo.bw.com.shopp.entity.ShopBean;
import demo.bw.com.shopp.model.IShopModel;
import demo.bw.com.shopp.contract.ShopContract;
import demo.bw.com.shopp.model.IShopModelCallback;
public class ShopPresenter extends ShopContract.ShopPresenter {
private IShopModel shopModel;
public ShopPresenter(ShopContract.IShopView iShopView){
shopModel=new IShopModel();
this.iShopView=iShopView;
}
private ShopContract.IShopView iShopView;
@Override
public void getShops( HashMap<String, String> params ) {
shopModel.getShops(params, new IShopModelCallback() {
@Override
public void success( String result ) {
ShopBean shopBean=new Gson().fromJson(result,ShopBean.class);
iShopView.success(shopBean.data);
}
@Override
public void failure( String msg ) {
iShopView.failure(msg);
}
});
}
}
view
package demo.bw.com.shopp.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
public class IView extends View {
public IView( Context context ) {
super(context);
}
public IView( Context context,AttributeSet attrs ) {
super(context, attrs);
}
public IView( Context context, AttributeSet attrs, int defStyleAttr ) {
super(context, attrs, defStyleAttr);
}
}
AddMinusView
package demo.bw.com.shopp.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 demo.bw.com.shopp.R;
public class AddMinusView extends LinearLayout {
private TextView madd,mjian;
private EditText mnum;
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_num,this,true);
madd=view.findViewById(R.id.add);
mjian=view.findViewById(R.id.jian);
mnum=view.findViewById(R.id.num_et);
mnum.setText("1");
madd.setOnClickListener(new OnClickListener() {
@Override
public void onClick( View view ) {
num++;
mnum.setText(num+"");
if (addMinusCallback!=null){
addMinusCallback.numCallback(num);
}
}
});
mjian.setOnClickListener(new OnClickListener() {
@Override
public void onClick( View view ) {
num--;
if (num==0){
num=1;
Toast.makeText(getContext(),"不能减了",Toast.LENGTH_SHORT).show();
}
mnum.setText(num+"");
if (addMinusCallback!=null){
addMinusCallback.numCallback(num);
}
}
});
}
public int getNum(){
return num;
}
private AddMinusCallback addMinusCallback;
public void setAddMinusCallback(AddMinusCallback addMinusCallback){
this.addMinusCallback=addMinusCallback;
}
public interface AddMinusCallback {
void numCallback(int num);
}
}
适配器
adapter
ShopAdapter
package demo.bw.com.shopp.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.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.List;
import demo.bw.com.shopp.R;
import demo.bw.com.shopp.activity.ShopActivity;
import demo.bw.com.shopp.callback.ShopCallback;
import demo.bw.com.shopp.callback.ShopUICallback;
import demo.bw.com.shopp.entity.ShopBean;
public class ShopAdapter extends XRecyclerView.Adapter<ShopAdapter.MyVh> implements ShopCallback {
private Context context;
private List<ShopBean.Shop> shops;
private ShopUICallback shopCallback;
public void setshopCallback(ShopUICallback shopCallback){
this.shopCallback =shopCallback;
}
public ShopAdapter(Context context,List<ShopBean.Shop> shops){
this.context=context;
this.shops=shops;
}
@NonNull
@Override
public ShopAdapter.MyVh onCreateViewHolder( @NonNull ViewGroup viewGroup, int i ) {
View view=LayoutInflater.from(context).inflate(R.layout.activity_shop_item,viewGroup,false);
return new MyVh(view);
}
@Override
public void onBindViewHolder( @NonNull final MyVh myVh, int i ) {
final ShopBean.Shop shop=shops.get(i);
myVh.nameTv.setText(shop.sellerName);
myVh.checkBox.setChecked(shop.isChecked);
for (ShopBean.Shop.Product product:shop.list){
product.pos=i;
}
ProductAdapter productAdapter=new ProductAdapter(context,shop.list);
productAdapter.setshopCallback(this);
myVh.xRecyclerView.setLayoutManager(new LinearLayoutManager(context));
myVh.xRecyclerView.setAdapter(productAdapter);
myVh.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick( View view ) {
shop.isChecked=myVh.checkBox.isChecked();
for (ShopBean.Shop.Product product:shop.list){
product.isProductChecked=shop.isChecked;
}
notifyDataSetChanged();
if (shopCallback!=null){
shopCallback.notifyCart();
}
}
});
}
@Override
public int getItemCount() {
return shops==null? 0 :shops.size();
}
@Override
public void notifyCartItem( boolean isChecked, int postion ) {
shops.get(postion).isChecked=isChecked;
notifyDataSetChanged();
if (shopCallback!=null){
shopCallback.notifyCart();
}
}
@Override
public void notifyNum() {
if (shopCallback!=null){
shopCallback.notifyCart();
}
}
public class MyVh extends RecyclerView.ViewHolder {
private XRecyclerView xRecyclerView;
private CheckBox checkBox;
private TextView nameTv;
public MyVh( @NonNull View itemView ) {
super(itemView);
xRecyclerView = itemView.findViewById(R.id.rv);
checkBox = itemView.findViewById(R.id.checkbox);
nameTv = itemView.findViewById(R.id.name);
}
}
}
子适配器
ProductAdapter
package demo.bw.com.shopp.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.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.List;
import demo.bw.com.shopp.R;
import demo.bw.com.shopp.callback.ShopCallback;
import demo.bw.com.shopp.entity.ShopBean;
import demo.bw.com.shopp.widget.AddMinusView;
public class ProductAdapter extends XRecyclerView.Adapter<ProductAdapter.MyVh>{
private Context context;
private List<ShopBean.Shop.Product> shops;
private ShopCallback shopCallback;
public void setshopCallback(ShopCallback shopCallback){
this.shopCallback=shopCallback;
}
public ProductAdapter( Context context, List <ShopBean.Shop.Product> shops ) {
this.context = context;
this.shops = shops;
}
@NonNull
@Override
public ProductAdapter.MyVh onCreateViewHolder( @NonNull ViewGroup viewGroup, int i ) {
View view=LayoutInflater.from(context).inflate(R.layout.product_item_layout,viewGroup,false);
return new MyVh(view);
}
@Override
public void onBindViewHolder( @NonNull final ProductAdapter.MyVh myVh, int i ) {
final ShopBean.Shop.Product product=shops.get(i);
myVh.checkBox.setChecked(product.isProductChecked);
String[] imgs=product.images.split("\\|");
if (imgs!=null&&imgs.length>0){
Glide.with(context).load(imgs[0]).into(myVh.iv);
}
myVh.priceTv.setText("¥;"+product.price);
myVh.titleTv.setText(product.title);
myVh.addMinusView.setAddMinusCallback(new AddMinusView.AddMinusCallback() {
@Override
public void numCallback( int num ) {
product.num=num;
if (shopCallback!=null){
shopCallback.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 (shopCallback!=null){
shopCallback.notifyCartItem(false,product.pos);
}
}else {
product.isProductChecked=true;
for (ShopBean.Shop.Product shop:shops){
if (!myVh.checkBox.isChecked()){
shop.isProductChecked=false;
if (shopCallback!=null){
shopCallback.notifyCartItem(false,product.pos);
}
return;
}
if (myVh.checkBox.isChecked()){
shop.isProductChecked=true;
if (shopCallback!=null){
shopCallback.notifyCartItem(true,product.pos);
}
}
}
}
}
});
}
@Override
public int getItemCount() {
return shops==null? 0 :shops.size();
}
public class MyVh extends RecyclerView.ViewHolder {
private ImageView iv;
private CheckBox checkBox;
private TextView titleTv,priceTv;
private AddMinusView addMinusView;
public MyVh( @NonNull View itemView ) {
super(itemView);
iv=itemView.findViewById(R.id.iv_product);
checkBox=itemView.findViewById(R.id.checkbox);
titleTv=itemView.findViewById(R.id.title);
priceTv=itemView.findViewById(R.id.price);
addMinusView=itemView.findViewById(R.id.addminusView);
}
}
}