栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

RxJava+Retrofit+Mvp实现购物车

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

RxJava+Retrofit+Mvp实现购物车

本文实例为大家分享了RxJava Retrofit实现购物车展示的具体代码,供大家参考,具体内容如下

先给大家展示一下效果图

框架结构:

1.项目框架:MVP,图片加载用Fresco,网络请求用OKhttp+Retrofit实现(自己封装,加单例模式),
2.完成购物车数据添加(如果接口无数据,可用接口工具添加数据),
3.自定义view实现加减按钮,每次点击加减,item中的总数及总价要做出相应的改变。
4.当数量为1时,点击减号,数量不变,吐司提示用户最小数量为1。
5.底部总数及总价为所有item项中的总价及总数,每个item中数量价格的更改,底部总价总数要与之联动
6.实现单选反选全选功能,首次进入默认全选,item未选中时总数及总价不计入底部数据,改变选中状态时,底部总数及总价能做出正确修改
7.点击删除按钮,删除item,底部总数及总价能做出正确修改,接口数据删除。

添加所需要的依赖和联网权限

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'//Retrofit2所需要的包
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'//ConverterFactory的Gson依赖包
compile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4'//ConverterFactory的String依赖包
compile 'io.reactivex.rxjava2:rxjava:2.1.3'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'de.greenrobot:eventbus:3.0.0-beta1'
compile 'com.facebook.fresco:fresco:0.11.0'

在使用MVP模式前先分包

net包

API

public class API {
 public static String HOST="http://120.27.23.105/product/";
}

ServiceAPI

public interface ServiceAPI {
 @GET("getProductDetail")
 Flowable getXQ(@Query("pid")int pid, @Query("source")String str);
 @GET("addCart")
 Flowable getMsg(@Query("uid")int uid, @Query("pid")int pid, @Query("source")String str);
 @GET("getCarts")
 Flowable getCart(@Query("uid")int uid, @Query("source")String str);
}

成功的接口

public interface OnNetLisenter {
 void Success(T t);
}

Retrofit的封装

public class RetrofitHepler {
 public static OkHttpClient okHttpClient;
 public static ServiceAPI serViceAPI;
 
 static {
 getOkHttpClient();
 }
 public static OkHttpClient getOkHttpClient(){
 if(okHttpClient==null){
 synchronized (OkHttpClient.class){
 if(okHttpClient==null){
  okHttpClient=new OkHttpClient();
 }
 }
 }
 return okHttpClient;
 }
 public static ServiceAPI getSerViceAPI(){

 if(serViceAPI==null){
 synchronized (OkHttpClient.class){
 if(serViceAPI==null){
  serViceAPI=onCreate(ServiceAPI.class,API.HOST);
 }
 }
 }
 return serViceAPI;
 }
 public static  T onCreate(ClasstClass,String url){
 Retrofit retrofit = new Retrofit.Builder()
 .baseUrl(url)
 .addConverterFactory(GsonConverterFactory.create())
 .client(okHttpClient)
 .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
 //.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
 .build();
 return retrofit.create(tClass);
 }
}

bean包

详情页的Bean类

public class XQBean {
 

 private String msg;
 private SellerBean seller;
 private String code;
 private DataBean data;

 public String getMsg() {
 return msg;
 }

 public void setMsg(String msg) {
 this.msg = msg;
 }

 public SellerBean getSeller() {
 return seller;
 }

 public void setSeller(SellerBean seller) {
 this.seller = seller;
 }

 public String getCode() {
 return code;
 }

 public void setCode(String code) {
 this.code = code;
 }

 public DataBean getData() {
 return data;
 }

 public void setData(DataBean data) {
 this.data = data;
 }

 public static class SellerBean {
 

 private String description;
 private String icon;
 private String name;
 private int productNums;
 private double score;
 private int sellerid;

 public String getDescription() {
 return description;
 }

 public void setDescription(String description) {
 this.description = description;
 }

 public String getIcon() {
 return icon;
 }

 public void setIcon(String icon) {
 this.icon = icon;
 }

 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }

 public int getProductNums() {
 return productNums;
 }

 public void setProductNums(int productNums) {
 this.productNums = productNums;
 }

 public double getScore() {
 return score;
 }

 public void setScore(double score) {
 this.score = score;
 }

 public int getSellerid() {
 return sellerid;
 }

 public void setSellerid(int sellerid) {
 this.sellerid = sellerid;
 }
 }

 public static class DataBean {
 

 private double bargainPrice;
 private String createtime;
 private String detailUrl;
 private String images;
 private int itemtype;
 private int pid;
 private double price;
 private int pscid;
 private int salenum;
 private int sellerid;
 private String subhead;
 private String title;

 public double getBargainPrice() {
 return bargainPrice;
 }

 public void setBargainPrice(double bargainPrice) {
 this.bargainPrice = bargainPrice;
 }

 public String getCreatetime() {
 return createtime;
 }

 public void setCreatetime(String createtime) {
 this.createtime = createtime;
 }

 public String getDetailUrl() {
 return detailUrl;
 }

 public void setDetailUrl(String detailUrl) {
 this.detailUrl = detailUrl;
 }

 public String getImages() {
 return images;
 }

 public void setImages(String images) {
 this.images = images;
 }

 public int getItemtype() {
 return itemtype;
 }

 public void setItemtype(int itemtype) {
 this.itemtype = itemtype;
 }

 public int getPid() {
 return pid;
 }

 public void setPid(int pid) {
 this.pid = pid;
 }

 public double getPrice() {
 return price;
 }

 public void setPrice(double price) {
 this.price = price;
 }

 public int getPscid() {
 return pscid;
 }

 public void setPscid(int pscid) {
 this.pscid = pscid;
 }

 public int getSalenum() {
 return salenum;
 }

 public void setSalenum(int salenum) {
 this.salenum = salenum;
 }

 public int getSellerid() {
 return sellerid;
 }

 public void setSellerid(int sellerid) {
 this.sellerid = sellerid;
 }

 public String getSubhead() {
 return subhead;
 }

 public void setSubhead(String subhead) {
 this.subhead = subhead;
 }

 public String getTitle() {
 return title;
 }

 public void setTitle(String title) {
 this.title = title;
 }
 }
}

加入购物车的Bean

public class AddCart {
 private String msg;
 private String code;

 public String getMsg() {
 return msg;
 }

 public void setMsg(String msg) {
 this.msg = msg;
 }

 public String getCode() {
 return code;
 }

 public void setCode(String code) {
 this.code = code;
 }
}

商品类

public class CartBean {
 

 private String msg;
 private String code;
 private List data;

 public String getMsg() {
 return msg;
 }

 public void setMsg(String msg) {
 this.msg = msg;
 }

 public String getCode() {
 return code;
 }

 public void setCode(String code) {
 this.code = code;
 }

 public List getData() {
 return data;
 }

 public void setData(List data) {
 this.data = data;
 }

 public static class DataBean {
 

 private String sellerName;
 private String sellerid;
 private List list;

 private boolean check;

 public boolean isCheck() {
 return check;
 }

 public void setCheck(boolean check) {
 this.check = check;
 }
 public String getSellerName() {
 return sellerName;
 }

 public void setSellerName(String sellerName) {
 this.sellerName = sellerName;
 }

 public String getSellerid() {
 return sellerid;
 }

 public void setSellerid(String sellerid) {
 this.sellerid = sellerid;
 }

 public List getList() {
 return list;
 }

 public void setList(List list) {
 this.list = list;
 }

 public static class ListBean {
 

 private double bargainPrice;
 private String createtime;
 private String detailUrl;
 private String images;
 private int num;
 private int pid;
 private double price;
 private int pscid;
 private int selected;
 private int sellerid;
 private String subhead;
 private String title;
 private int cou=1;

 public int getCou() {
 return cou;
 }

 public void setCou(int cou) {
 this.cou = cou;
 }

 private boolean check;

 public boolean isCheck() {
 return check;
 }

 public void setCheck(boolean check) {
 this.check = check;
 }

 public double getBargainPrice() {
 return bargainPrice;
 }

 public void setBargainPrice(double bargainPrice) {
 this.bargainPrice = bargainPrice;
 }

 public String getCreatetime() {
 return createtime;
 }

 public void setCreatetime(String createtime) {
 this.createtime = createtime;
 }

 public String getDetailUrl() {
 return detailUrl;
 }

 public void setDetailUrl(String detailUrl) {
 this.detailUrl = detailUrl;
 }

 public String getImages() {
 return images;
 }

 public void setImages(String images) {
 this.images = images;
 }

 public int getNum() {
 return num;
 }

 public void setNum(int num) {
 this.num = num;
 }

 public int getPid() {
 return pid;
 }

 public void setPid(int pid) {
 this.pid = pid;
 }

 public double getPrice() {
 return price;
 }

 public void setPrice(double price) {
 this.price = price;
 }

 public int getPscid() {
 return pscid;
 }

 public void setPscid(int pscid) {
 this.pscid = pscid;
 }

 public int getSelected() {
 return selected;
 }

 public void setSelected(int selected) {
 this.selected = selected;
 }

 public int getSellerid() {
 return sellerid;
 }

 public void setSellerid(int sellerid) {
 this.sellerid = sellerid;
 }

 public String getSubhead() {
 return subhead;
 }

 public void setSubhead(String subhead) {
 this.subhead = subhead;
 }

 public String getTitle() {
 return title;
 }

 public void setTitle(String title) {
 this.title = title;
 }
 }
 }
}

app

public class MyApp extends Application{
 @Override
 public void onCreate() {
 super.onCreate();

 Fresco.initialize(this);
 }
}

view层

先写两个接口

public interface ICart {
 void showlist(List grouplist, List> childlist);
}
public interface IView {
 void showBean(T t);
 void showStr(String s);
}

主页面布局




 
 
 
 
 
 
 

 
 
 



主页面

public class MainActivity extends AppCompatActivity implements ICart {

 private ExpandableListView mElv;
 private CheckBox mQuanxuan;
 private TextView mZongjia;
 private TextView mTvCount;
 private MyExpandableAdapter myExpandableAdapter;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 initView();
 new CartPresenter(this).getCart();
 EventBus.getDefault().register(this);
 mQuanxuan.setonClickListener(new View.onClickListener() {
 @Override
 public void onClick(View v) {
 myExpandableAdapter.qx(mQuanxuan.isChecked());
 }
 });
 }

 private void initView() {
 mElv = (ExpandableListView) findViewById(R.id.elv);
 mQuanxuan = (CheckBox) findViewById(R.id.quanxuan);
 mZongjia = (TextView) findViewById(R.id.zongjia);
 mTvCount = (TextView) findViewById(R.id.tv_count);
 }

 @Override
 public void showlist(List grouplist, List> childlist) {
 myExpandableAdapter = new MyExpandableAdapter(grouplist, this,childlist);
 mElv.setAdapter(myExpandableAdapter);
 for (int i = 0; i 

第二个页面布局




 
 
 
 

实现购物车的代码

public class AddActivity extends AppCompatActivity implements View.OnClickListener,IView {

 private SimpleDraweeView mXqsdv;
 private TextView mTvtitle;
 private Button mTiaozhuan;
 private Button mTianjia;
 private LinearLayout mAddActivity;
 private XQPresenter xqPresenter;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_add);

 initView();
 xqPresenter=new XQPresenter(this);
 xqPresenter.getXQ();
 }

 private void initView() {
 mXqsdv = (SimpleDraweeView) findViewById(R.id.xqsdv1);
 mTvtitle = (TextView) findViewById(R.id.tvtitle1);
 mTiaozhuan = (Button) findViewById(R.id.tiaozhuan1);
 mTiaozhuan.setonClickListener(this);
 mTianjia = (Button) findViewById(R.id.tianjia1);
 mTianjia.setonClickListener(this);
 mAddActivity = (LinearLayout) findViewById(R.id.activity_add);
 }

 @Override
 public void onClick(View v) {
 switch (v.getId()) {
 default:
 break;

 //跳到MainActivity (购物车)
 case R.id.tiaozhuan1:
 startActivity(new Intent(this,MainActivity.class));
 break;
 case R.id.tianjia1:
 xqPresenter.getAdd();
 break;
 }
 }

 @Override
 public void showBean(Object o) {
 XQBean xqBean = (XQBean) o;
 XQBean.DataBean data = xqBean.getData();
 String s = data.getImages().split("\|")[0];
 Uri uri =Uri.parse(s);//地址转换成URI
 mXqsdv.setImageURI(uri);
 mTvtitle.setText(data.getTitle()+"n"+data.getPrice());
 }

 @Override
 public void showStr(String s) {
 Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
 }
}

eventbus包

设置一个数量和价格的类

public class CountAndPrice {
 private int count ;
 private int price;

 public int getCount() {
 return count;
 }

 public void setCount(int count) {
 this.count = count;
 }

 public int getPrice() {
 return price;
 }

 public void setPrice(int price) {
 this.price = price;
 }
}

EventBus

public class MessgeEvent {
 private boolean check;

 public boolean isCheck() {
 return check;
 }

 public void setCheck(boolean check) {
 this.check = check;
 }
}

model

实现详情页model层的接口

public interface IXQModel {
 public void getXQ(int pid, String str, final OnNetLisenter cgsb);
}

实现详情页model

public class XQModel implements IXQModel{

 @Override
 public void getXQ(int pid, String str, final OnNetLisenter onNetLisenter) {
 Flowable flowable = RetrofitHepler.getSerViceAPI().getXQ(pid, str);
 flowable.observeOn(AndroidSchedulers.mainThread())
 .subscribeOn(Schedulers.io())
 .subscribe(new Consumer() {
  @Override
  public void accept(XQBean xqBean) throws Exception {
  onNetLisenter.Success(xqBean);
  }
 });
 }

 public void getAdd(int uid, int pid, String str, final onNetLisenter onNetLisenter){
 Flowable flowable = RetrofitHepler.getSerViceAPI().getMsg(uid, pid, str);
 flowable.observeOn(AndroidSchedulers.mainThread())
 .subscribeOn(Schedulers.io())
 .subscribe(new Consumer() {
  @Override
  public void accept(AddCart addCart) throws Exception {
  onNetLisenter.Success(addCart);
  }
 });
 }
}

购物车的model

public class CartModel {
 public void getCart(int uid, String str, final OnNetLisenter onNetLisenter){
 Flowable flowable = RetrofitHepler.getSerViceAPI().getCart(uid,str);
 flowable.observeOn(AndroidSchedulers.mainThread())
 .subscribeOn(Schedulers.io())
 .subscribe(new Consumer() {
  @Override
  public void accept(CartBean cartBean) throws Exception {
  onNetLisenter.Success(cartBean);
  }
 });
 }
}

presenter层

详情页的P层

public class XQPresenter {
 private final XQModel xqModel;
 private IView iView;
 public XQPresenter(IView iView) {
 xqModel = new XQModel();
 this.iView=iView;
 }
 public void getXQ(){
 xqModel.getXQ(12, "android", new OnNetLisenter() {
 @Override
 public void Success(XQBean xqBean) {
 iView.showBean(xqBean);
 }
 });
 }
 public void getAdd(){
 xqModel.getAdd(3043, 12, "android", new onNetLisenter() {
 @Override
 public void Success(AddCart addCart) {
 iView.showStr(addCart.getMsg());
 }
 });
 }
}

购物车的P层

public class CartPresenter {
 private ICart iCart;
 private final CartModel cartModel;

 public CartPresenter(ICart iCart) {
 this.iCart = iCart;
 cartModel = new CartModel();

 }
 public void getCart(){
 cartModel.getCart(3043,"android",new OnNetLisenter(){

 @Override
 public void Success(CartBean cartBean) {
 List grouplist = cartBean.getData();
 List> childlist = new ArrayList<>();
 for (int i = 0; i < grouplist.size(); i++) {
  CartBean.DataBean dataBean = grouplist.get(i);
  List list = dataBean.getList();
  childlist.add(list);
 }
 iCart.showlist(grouplist,childlist);
 }
 });
 }
}

adapter

public class MyExpandableAdapter extends baseExpandableListAdapter {
 private List groupdata;
 private Context context;
 private List> childlist;

 public MyExpandableAdapter( List groupdata, Context context, List> childlist) {
 this.groupdata = groupdata;
 this.context = context;
 this.childlist = childlist;
 }

 @Override
 public int getGroupCount() {
 return groupdata.size();
 }

 @Override
 public int getChildrenCount(int groupPosition) {
 return childlist.get(groupPosition).size();
 }

 @Override
 public Object getGroup(int groupPosition) {
 return groupdata.get(groupPosition);
 }

 @Override
 public Object getChild(int groupPosition, int childPosition) {
 return null;
 }

 @Override
 public long getGroupId(int groupPosition) {
 return groupPosition;
 }

 @Override
 public long getChildId(int groupPosition, int childPosition) {
 return childPosition;
 }

 @Override
 public boolean hasStableIds() {
 return false;
 }

 @Override
 public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
 final GroupViewHolder holder;
 if (convertView == null) {
 convertView = View.inflate(context, R.layout.group_item, null);
 holder = new GroupViewHolder();
 holder.tv_group = (TextView) convertView.findViewById(R.id.tv_group);
 holder.group_cb = (CheckBox) convertView.findViewById(R.id.gx_group);

 convertView.setTag(holder);
 } else {
 holder = (GroupViewHolder) convertView.getTag();
 }
 final CartBean.DataBean dataBean = groupdata.get(groupPosition);

 String sellerName = dataBean.getSellerName();
 holder.group_cb.setChecked(dataBean.isCheck());
 //点击一级checkbox的状态
 holder.group_cb.setonClickListener(new View.onClickListener() {
 @Override
 public void onClick(View v) {
 dataBean.setCheck(holder.group_cb.isChecked());
 //改变所有孩子的状态
 changeChildState(groupPosition,holder.group_cb.isChecked());
 EventBus.getDefault().post(jS());
 //通过判断一级的checkbox判断全选的状态
 changeMianQXstatus(checkGroupAll());
 notifyDataSetChanged();
 }
 });


 return convertView;
 }

 @Override
 public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
 final ChildViewHolder holder;
 if (convertView == null) {
 convertView = View.inflate(context, R.layout.child_item, null);
 holder = new ChildViewHolder();

 holder.tv_title= (TextView) convertView.findViewById(R.id.title);
 holder.price= (TextView) convertView.findViewById(R.id.price);
 holder.child_cb= (CheckBox) convertView.findViewById(R.id.gouxuan_child);
 holder.add= (TextView) convertView.findViewById(R.id.jia);
 holder.del= (TextView) convertView.findViewById(R.id.del);
 holder.jian= (TextView) convertView.findViewById(R.id.jian);
 holder.sdv= (SimpleDraweeView) convertView.findViewById(R.id.title_img);
 holder.tv_num= (TextView) convertView.findViewById(R.id.tv_num);
 holder.yanse= (TextView) convertView.findViewById(R.id.yanse);
 convertView.setTag(holder);
 } else {
 holder = (ChildViewHolder) convertView.getTag();
 }
 final CartBean.DataBean.ListBean listBean = childlist.get(groupPosition).get(childPosition);
 int price = (int) listBean.getPrice();
 holder.child_cb.setChecked(listBean.isCheck());
 holder.price.setText("¥:"+price+"");
 String title = listBean.getTitle();
 holder.tv_title.setText(title);
 String subhead = listBean.getSubhead();
 String substring = subhead.substring(1, 10)+".....";
 holder.yanse.setText(substring);
 String images = listBean.getImages();
 String[] split = images.split("\|");
 String s = split[0];
 Uri uri=Uri.parse(s);
 holder.sdv.setImageURI(uri);
 // listBean.setCou(Integer.parseInt(holder.tv_num.getText().toString()));
 //给子条目的checkBox点击事件
 holder.child_cb.setonClickListener(new View.onClickListener() {
 @Override
 public void onClick(View v) {
 listBean.setCheck(holder.child_cb.isChecked());

 EventBus.getDefault().post(jS());
 //如果二级的checkBox选中,就让一级的checkBox勾选
 if(holder.child_cb.isChecked()) {

  if (ischeckAllchild(groupPosition)) {
  //改变一级checkBox的状态
  changeGroupstatus(groupPosition,true);
  //通过判断一级的CheckBox的状态来改变全选的状态
  changeMianQXstatus(checkGroupAll());

  }
 }else{
  changeGroupstatus(groupPosition,false);
  changeMianQXstatus(checkGroupAll());
 }
 notifyDataSetChanged();
 }

 });

 //点击加加的功能
 holder.add.setonClickListener(new View.onClickListener() {
 @Override
 public void onClick(View v) {
 int cou = listBean.getCou();
 holder.tv_num.setText(++cou+"");
 listBean.setCou(cou);
 if(holder.child_cb.isChecked()){
  EventBus.getDefault().post(jS());
 }

 }
 });
 //点击减减的功能
 holder.jian.setonClickListener(new View.onClickListener() {
 @Override
 public void onClick(View v) {
 int cou = listBean.getCou();

 if(cou==1) {
  Toast.makeText(context, "最小数量为1", Toast.LENGTH_SHORT).show();
  return;}
 holder.tv_num.setText(--cou+"");
 listBean.setCou(cou);
 if (holder.child_cb.isChecked()) {
  EventBus.getDefault().post(jS());

 }
 }
 });
 //点击删除
 holder.del.setonClickListener(new View.onClickListener() {
 @Override
 public void onClick(View v) {
 List listBeen = childlist.get(groupPosition);

 CartBean.DataBean.ListBean remove = listBeen.remove(childPosition);
 if(listBeen.size()==0){
  childlist.remove(childPosition);
  groupdata.remove(groupPosition);
 }
 EventBus.getDefault().post(jS());
 notifyDataSetChanged();

 }
 });

 return convertView;
 }

 @Override
 public boolean isChildSelectable(int groupPosition, int childPosition) {
 return true;
 }

 class GroupViewHolder {
 CheckBox group_cb;
 TextView tv_group;
 }

 class ChildViewHolder {
 CheckBox child_cb;
 TextView tv_title,price,yanse,tv_num;
 TextView del,add,jian;
 SimpleDraweeView sdv;


 }
 
 private boolean ischeckAllchild(int g){
 List listBeen = childlist.get(g);

 for (int i = 0; i  listBeen = childlist.get(grouPistion);
 for (int i = 0; i < listBeen.size(); i++) {
 listBeen.get(i).setCheck(flag);
 }
 }
 
 public void qx(boolean flag){
 for (int i = 0; i < groupdata.size(); i++) {
 changeGroupstatus(i, flag);
 changeChildState(i, flag);
 }
 EventBus.getDefault().post(jS());
 notifyDataSetChanged();
 }
}

group_item.xml




 
 

child_item.xml




 
 
 
 
 
 
 
 
 

 

 
 

 
 
 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/140957.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号