本文实例为大家分享了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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。



