1.ShopCarContract
package com.example.jingdong.ui.shopcar.contract;
import com.example.jingdong.bean.BaseBean;
import com.example.jingdong.bean.SellerBean;
import com.example.jingdong.bean.ShopCarBean;
import com.example.jingdong.ui.base.BaseContract;
import java.util.List;
public interface ShopCarContract {
interface View extends BaseContract.BaseView{
void showShopCar(List<SellerBean> groupList, List<List<ShopCarBean.DataBean.ListBean>> childList);
void updateSuccess(BaseBean baseBean);
void delSuccess(BaseBean baseBean);
}
interface Presenter extends BaseContract.BasePresenter<View>{
void getShopCar(String uid, String token);
void updateShopCar(String uid, String sellerid, String pid, String num, String selected, String token);
void delShopCar(String uid, String pid, String token);
}
}
2.ShopCarPresenter
package com.example.jingdong.ui.shopcar.presenter;
import com.example.jingdong.bean.BaseBean;
import com.example.jingdong.bean.SellerBean;
import com.example.jingdong.bean.ShopCarBean;
import com.example.jingdong.net.NetApi;
import com.example.jingdong.net.NetApiService;
import com.example.jingdong.ui.base.BasePresenter;
import com.example.jingdong.ui.shopcar.contract.ShopCarContract;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import io.reactivex.Observer;
import io.reactivex.Scheduler;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
public class ShopCarPresenter extends BasePresenter<ShopCarContract.View> implements ShopCarContract.Presenter{
private NetApi netApi;
@Inject
public ShopCarPresenter(NetApi netApi) {
this.netApi = netApi;
}
@Override
public void getShopCar(String uid, String token) {
netApi.getCar(uid, token)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Observer<ShopCarBean>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ShopCarBean shopCarBean) {
if (mView!=null){
//用于封装一级列表
List<SellerBean> groupList = new ArrayList<>();
//用于封装二级列表
List<List<ShopCarBean.DataBean.ListBean>> childList = new ArrayList<>();
//获取数据
List<ShopCarBean.DataBean> data = shopCarBean.getData();
//循环获取数据
for (int i = 0; i < data.size(); i++) {
ShopCarBean.DataBean dataBean = data.get(i);
//添加父集合
SellerBean sellerBean = new SellerBean();
sellerBean.setSellerName(dataBean.getSellerName());
sellerBean.setSellerid(dataBean.getSellerid());
//设置是否全部选中
sellerBean.setSelected(isSellerProductAllSeleect(dataBean));
groupList.add(sellerBean);
//添加子集合
childList.add(data.get(i).getList());
}
//展示数据
mView.showShopCar(groupList,childList);
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
@Override
public void updateShopCar(String uid, String sellerid, String pid, String num, String selected, String token) {
netApi.updateCar(uid, sellerid, pid, num, selected, token)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<BaseBean>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(BaseBean baseBean) {
mView.updateSuccess(baseBean);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
@Override
public void delShopCar(String uid, String pid, String token) {
netApi.delCar(uid, pid, token)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Observer<BaseBean>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(BaseBean baseBean) {
mView.delSuccess(baseBean);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
//判断该商家下面的商品是否全选
private boolean isSellerProductAllSeleect(ShopCarBean.DataBean dataBean){
//获取该商家下的所有商品
List<ShopCarBean.DataBean.ListBean> list = dataBean.getList();
for (int i = 0; i < list.size(); i++) {
ShopCarBean.DataBean.ListBean listBean = list.get(i);
if (0==listBean.getSelected()){
return false;
}
}
return true;
}
}
3.ShopCarFragment
package com.example.jingdong.ui.shopcar;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.TextView;
import com.example.jingdong.R;
import com.example.jingdong.bean.BaseBean;
import com.example.jingdong.bean.SellerBean;
import com.example.jingdong.bean.ShopCarBean;
import com.example.jingdong.component.DaggerHttpComponent;
import com.example.jingdong.ui.base.BaseFragment;
import com.example.jingdong.ui.shopcar.adapter.ElvShopCarAdapter;
import com.example.jingdong.ui.shopcar.contract.ShopCarContract;
import com.example.jingdong.ui.shopcar.presenter.ShopCarPresenter;
import com.example.jingdong.util.DialogUtil;
import com.example.jingdong.util.SpUtil;
import java.util.List;
public class ShopCarFragment extends BaseFragment<ShopCarPresenter> implements ShopCarContract.View {
private ExpandableListView elv_shopcar;
/**
* 全选
*/
private CheckBox ck_all;
/**
* 合计:
*/
private TextView tv_Money;
/**
* 去结算:
*/
private TextView tv_Total;
private ProgressDialog progressDialog;
private ElvShopCarAdapter elvShopCarAdapter;
@Override
public int getContentLayout() {
return R.layout.fragment_shopcar;
}
@Override
public void inject() {
DaggerHttpComponent.builder()
.build()
.inject(this);
}
@Override
public void initView(View view) {
elv_shopcar = (ExpandableListView) view.findViewById(R.id.elv_shopcar);
ck_all = (CheckBox) view.findViewById(R.id.ck_all);
tv_Money = (TextView) view.findViewById(R.id.tv_Money);
tv_Total = (TextView) view.findViewById(R.id.tv_Total);
//初始化进度显示
progressDialog = DialogUtil.getProgressDialog(getActivity());
//获取uid和token值
String uid = SpUtil.getString(getActivity(), "uid", "");
String token = SpUtil.getString(getActivity(), "token", "");
//获取数据
if (!("").equals(uid) && !("").equals(token)){
mPresenter.getShopCar(uid,token);
}
//点击全选按钮的监听
ck_all.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (elvShopCarAdapter!=null){
progressDialog.show();
elvShopCarAdapter.changeAllState(ck_all.isChecked());
}
}
});
}
@Override
public void showShopCar(List<SellerBean> groupList, List<List<ShopCarBean.DataBean.ListBean>> childList) {
//判断所有商家是否全部选中
ck_all.setChecked(isSellerAllSelected(groupList));
//设置适配器
elvShopCarAdapter = new ElvShopCarAdapter(groupList, childList, getActivity(), mPresenter, progressDialog);
elv_shopcar.setAdapter(elvShopCarAdapter);
//获取商品总价和数量
String[] strings = elvShopCarAdapter.computeMoneyAndNum();
tv_Money.setText("总计:" + strings[0] + "元");
tv_Total.setText("去结算" + strings[1] + "个");
//默认全部展开
for (int i = 0; i < groupList.size(); i++) {
elv_shopcar.expandGroup(i);
}
//关闭进度条
progressDialog.dismiss();
}
@Override
public void updateSuccess(BaseBean baseBean) {
elvShopCarAdapter.updateSuccess();
}
@Override
public void delSuccess(BaseBean baseBean) {
elvShopCarAdapter.delSuccess();
}
private boolean isSellerAllSelected(List<SellerBean> groupList){
for (int i = 0; i < groupList.size(); i++) {
SellerBean sellerBean = groupList.get(i);
if (!sellerBean.isSelected()){
return false;
}
}
return true;
}
}
4.NetApiService
package com.example.jingdong.net;
import com.example.jingdong.bean.BaseBean;
import com.example.jingdong.bean.GoodsListBean;
import com.example.jingdong.bean.ShopCarBean;
import com.example.jingdong.bean.UserBean;
import io.reactivex.Observable;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
public interface NetApiService {
//获取商品列表
@FormUrlEncoded
@POST("product/getProducts")
Observable<GoodsListBean> getGoodsList(@Field("pscid") String pscid);
//登录
@FormUrlEncoded
@POST("user/login")
Observable<UserBean> login(@Field("mobile") String mobile, @Field("password") String password);
//添加购物车
@FormUrlEncoded
@POST("product/addCart")
Observable<BaseBean> addCar(@Field("Uid") String uid, @Field("Pid") String pid, @Field("Token") String token);
//查询购物车
@FormUrlEncoded
@POST("product/getCarts")
Observable<ShopCarBean> getCar(@Field("uid") String uid, @Field("token") String token);
//更新购物车
@FormUrlEncoded
@POST("product/updateCarts")
Observable<BaseBean> updateCar(@Field("uid") String uid,
@Field("sellerid") String sellerid,
@Field("pid") String pid,
@Field("num") String num,
@Field("selected") String selected,
@Field("token") String token);
//删除购物车
@FormUrlEncoded
@POST("product/deleteCart")
Observable<BaseBean> delCar(@Field("uid") String uid, @Field("pid") String pid, @Field("token") String token);
}
5.NetApi
package com.example.jingdong.net;
import com.example.jingdong.bean.BaseBean;
import com.example.jingdong.bean.GoodsListBean;
import com.example.jingdong.bean.ShopCarBean;
import com.example.jingdong.bean.UserBean;
import io.reactivex.Observable;
import retrofit2.http.Field;
public class NetApi {
private static NetApi netApi;
private NetApiService netApiService;
private NetApi(NetApiService netApiService) {
this.netApiService = netApiService;
}
public static NetApi getNetApi(NetApiService netApiService) {
if (netApi == null) {
netApi = new NetApi(netApiService);
}
return netApi;
}
//获取商品列表
public Observable<GoodsListBean> getGoodsList(String pscid) {
return netApiService.getGoodsList(pscid);
}
//实现登录
public Observable<UserBean> login(String mobile, String password) {
return netApiService.login(mobile, password);
}
//添加购物车
public Observable<BaseBean> addCar(String uid, String pid, String token) {
return netApiService.addCar(uid, pid, token);
}
//查询购物车
public Observable<ShopCarBean> getCar(String uid, String token) {
return netApiService.getCar(uid, token);
}
//更新购物车
public Observable<BaseBean> updateCar(String uid, String sellerid, String pid, String num, String selected, String token) {
return netApiService.updateCar(uid, sellerid, pid, num, selected, token);
}
//删除购物车
public Observable<BaseBean> delCar(String uid, String pid, String token) {
return netApiService.delCar(uid, pid, token);
}
}
6.适配器ElvShopCarAdapter
package com.example.jingdong.ui.shopcar.adapter;
import android.app.ProgressDialog;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.example.jingdong.R;
import com.example.jingdong.bean.SellerBean;
import com.example.jingdong.bean.ShopCarBean;
import com.example.jingdong.ui.shopcar.presenter.ShopCarPresenter;
import com.example.jingdong.ui.widget.AddSubView;
import com.example.jingdong.util.SpUtil;
import java.util.List;
public class ElvShopCarAdapter extends BaseExpandableListAdapter{
private List<SellerBean> groupList;
private List<List<ShopCarBean.DataBean.ListBean>> childList;
private Context context;
private ShopCarPresenter shopCarPresenter;
private final LayoutInflater inflater;
private ProgressDialog progressDialog;
private int productIndex;
private int groupPosition;
private static final int GETCARS = 0;//查询购物车
private static final int UPDATE_PRODUCT = 1;//更新商品
private static final int UPDATE_SELLER = 2;//更新卖家
private static int state = GETCARS;
private final String uid;
private final String token;
private boolean checked;
private boolean allChecked;
public ElvShopCarAdapter(List<SellerBean> groupList, List<List<ShopCarBean.DataBean.ListBean>> childList, Context context, ShopCarPresenter shopCarPresenter, ProgressDialog progressDialog) {
this.groupList = groupList;
this.childList = childList;
this.context = context;
this.shopCarPresenter = shopCarPresenter;
this.progressDialog = progressDialog;
inflater=LayoutInflater.from(context);
//获取uid和token
uid = SpUtil.getString(context, "uid", "");
token = SpUtil.getString(context, "token", "");
}
@Override
public int getGroupCount() {
return groupList.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return childList.get(groupPosition).size();
}
@Override
public Object getGroup(int groupPosition) {
return groupList.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return childList.get(groupPosition).get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
final GroupViewHolder groupViewHolder;
if (convertView == null) {
convertView = View.inflate(context, R.layout.elv_shopcarseller_item, null);
groupViewHolder = new GroupViewHolder(convertView);
convertView.setTag(groupViewHolder);
} else {
groupViewHolder = (GroupViewHolder) convertView.getTag();
}
//设置是否全部选中
groupViewHolder.ck_seller.setChecked(groupList.get(groupPosition).isSelected());
//设置数据
groupViewHolder.tv_sellername.setText(groupList.get(groupPosition).getSellerName());
//给商家的CheckBox设置点击事件
groupViewHolder.ck_seller.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
state = UPDATE_PRODUCT;
//显示进度条
progressDialog.show();
//默认从第一个商品开始更新购物车状态
productIndex = 0;
//全局记录一下当前更新的商家
ElvShopCarAdapter.this.groupPosition = groupPosition;
//该商家是否选中
checked = groupViewHolder.ck_seller.isChecked();
//更新商家下的商品状态
updateProductInSeller();
}
});
return convertView;
}
@Override
public View getChildView(final int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
final ChildViewHolder childViewHolder;
if (convertView == null) {
convertView = View.inflate(context, R.layout.elv_shopcarsellerpro_item, null);
childViewHolder = new ChildViewHolder(convertView);
convertView.setTag(childViewHolder);
} else {
childViewHolder = (ChildViewHolder) convertView.getTag();
}
//获取单个子商品
final ShopCarBean.DataBean.ListBean listBean = childList.get(groupPosition).get(childPosition);
//根据服务器返回的select值,给CheckBox设置是否选中
childViewHolder.ck_product.setChecked(listBean.getSelected() == 1 ? true : false);
//设置数据
childViewHolder.tv_producttitle.setText(listBean.getTitle());
childViewHolder.tv_productprice.setText("¥" + listBean.getPrice() + "");
Glide.with(context).load(listBean.getImages().split("\\|")[0]).into(childViewHolder.img_product);
//设置数量
childViewHolder.addsubcar.setNum(listBean.getNum() + "");
//给子条目的CheckBox设置点击事件
childViewHolder.ck_product.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
progressDialog.show();
state = GETCARS;
ElvShopCarAdapter.this.groupPosition = groupPosition;
//获取sellerid
String sellerid = groupList.get(groupPosition).getSellerid();
//获取pid
String pid = listBean.getPid() + "";
String num = listBean.getNum() + "";
//是否选中
boolean childChecked = childViewHolder.ck_product.isChecked();
//更新购物车
shopCarPresenter.updateShopCar(uid, sellerid, pid, num, childChecked ? "1" : "0", token);
}
});
//给加号设置点击事件
childViewHolder.addsubcar.setAddOnclickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
progressDialog.show();
state = GETCARS;
//获取sellerid
String sellerid = groupList.get(groupPosition).getSellerid();
//获取pid
int pid = listBean.getPid();
//获取数量
int num = listBean.getNum();
num++;
//是否选中
String isChecked = childViewHolder.ck_product.isChecked() ? "1" : "0";
//调用更新购物车的接口
shopCarPresenter.updateShopCar(uid, sellerid, pid + "", num + "", isChecked, token);
}
});
//给减号设置点击事件
childViewHolder.addsubcar.setSubOnclickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
progressDialog.show();
state = GETCARS;
//获取当前商品的数量
int num = listBean.getNum();
if (num <= 1) {
progressDialog.dismiss();
Toast.makeText(context, "数量不能小于1!", Toast.LENGTH_SHORT).show();
} else {
num--;
//获取sellerid
String sellerid = groupList.get(groupPosition).getSellerid();
//获取pid
String pid = listBean.getPid() + "";
//是否选中
String isChecked = childViewHolder.ck_product.isChecked() ? "1" : "0";
//更新服务器上购物车状态
shopCarPresenter.updateShopCar(uid, sellerid, pid, num + "", isChecked, token);
}
}
});
//给删除设置点击事件
childViewHolder.tv_del.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
progressDialog.show();
state = GETCARS;
//获取商品的pid
int pid = listBean.getPid();
//开始删除购物车里的选项
shopCarPresenter.delShopCar(uid, pid + "", token);
}
});
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
//父控件的viewholder
public static class GroupViewHolder {
public View rootView;
public CheckBox ck_seller;
public TextView tv_sellername;
public GroupViewHolder(View rootView) {
this.rootView = rootView;
this.ck_seller = (CheckBox) rootView.findViewById(R.id.ck_seller);
this.tv_sellername = (TextView) rootView.findViewById(R.id.tv_sellername);
}
}
//子控件的viewholder
public static class ChildViewHolder {
public View rootView;
public CheckBox ck_product;
public TextView tv_del;
public ImageView img_product;
public TextView tv_producttitle;
public TextView tv_productprice;
public AddSubView addsubcar;
public ChildViewHolder(View rootView) {
this.rootView = rootView;
this.ck_product = (CheckBox) rootView.findViewById(R.id.ck_product);
this.tv_del = (TextView) rootView.findViewById(R.id.tv_del);
this.img_product = (ImageView) rootView.findViewById(R.id.img_product);
this.tv_producttitle = (TextView) rootView.findViewById(R.id.tv_producttitle);
this.tv_productprice = (TextView) rootView.findViewById(R.id.tv_productprice);
this.addsubcar = (AddSubView) rootView.findViewById(R.id.addsubcar);
}
}
//更新购物车成功的回调
public void updateSuccess() {
switch (state) {
case GETCARS:
//更新成功后调用查询购物车接口
productIndex = 0;
groupPosition = 0;
shopCarPresenter.getShopCar(uid, token);
break;
case UPDATE_PRODUCT:
//更新成功一个商品以后,再接着更新该商家下的其他商品,直到没有商品为止
productIndex++;
//判断下标是否越界
if (productIndex < childList.get(groupPosition).size()) {
//可以继续更新商品
updateProductInSeller();
} else {
//商品已经全部更新完查询购物车
state = GETCARS;
updateSuccess();
}
break;
case UPDATE_SELLER:
//遍历所有商家下的商品,并更新状态
productIndex++;
//下标是否越界
if (productIndex<childList.get(groupPosition).size()){
//可以继续更新商品
updateProductInSeller(allChecked);
}else {
//第一个商家的商品已经全部更新完,请查询购物车
productIndex=0;
groupPosition++;
if (groupPosition<groupList.size()){
//可以继续更新商品
updateProductInSeller(allChecked);
}else {
//所有商家的所有商品已经全部更新完,查询购物车
state=GETCARS;
updateSuccess();
}
}
break;
}
}
//删除购物车成功的回调
public void delSuccess() {
//查询购物车
shopCarPresenter.getShopCar(uid, token);
}
//更新商家下的商品状态
private void updateProductInSeller() {
//获取sellerid
SellerBean sellerBean = groupList.get(groupPosition);
String sellerid = sellerBean.getSellerid();
//获取pid
ShopCarBean.DataBean.ListBean listBean = childList.get(groupPosition).get(productIndex);
int pid = listBean.getPid();
int num = listBean.getNum();
//开始更新
shopCarPresenter.updateShopCar(uid, sellerid, pid + "", num + "", checked ? "1" : "0", token);
}
private void updateProductInSeller(boolean bool) {
//获取sellerid
SellerBean sellerBean = groupList.get(groupPosition);
String sellerid = sellerBean.getSellerid();
//获取pid
ShopCarBean.DataBean.ListBean listBean = childList.get(groupPosition).get(productIndex);
int pid = listBean.getPid();
int num = listBean.getNum();
//开始更新
shopCarPresenter.updateShopCar(uid, sellerid, pid + "", num + "", bool ? "1" : "0", token);
}
//计算数量和价钱
public String[] computeMoneyAndNum() {
double sum = 0;
int num = 0;
for (int i = 0; i < groupList.size(); i++) {
for (int j = 0; j < childList.get(i).size(); j++) {
//判断商品是否选中
ShopCarBean.DataBean.ListBean listBean = childList.get(i).get(j);
if (listBean.getSelected() == 1) {
//该商品为选中状态
sum += listBean.getPrice() * listBean.getNum();
num += listBean.getNum();
}
}
}
return new String[]{sum + "", num + ""};
}
//全选复选框更新状态
public void changeAllState(boolean bool) {
this.allChecked = bool;
state = UPDATE_SELLER;
//遍历商家下的商品修改状态
updateProductInSeller(bool);
}
}
7.父条目布局
<?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="33dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<CheckBox
android:id="@+id/ck_seller"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"/>
<TextView
android:id="@+id/tv_sellername"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="2dp"/>
</LinearLayout>
8.子条目布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="2dp">
<CheckBox
android:id="@+id/ck_product"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="12dp" />
<TextView
android:id="@+id/tv_del"
android:layout_width="45dp"
android:layout_height="30dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:background="#ff0000"
android:gravity="center"
android:text="删除"
android:textColor="#fff" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_toLeftOf="@id/tv_del"
android:layout_toRightOf="@id/ck_product"
android:orientation="horizontal">
<ImageView
android:id="@+id/img_product"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center_vertical" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="2dp"
android:layout_marginLeft="2dp"
android:layout_marginTop="2dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_producttitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="title"
android:lines="2"
android:ellipsize="end"
android:textSize="11sp" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_productprice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="12312"
android:textColor="#f00"
android:textSize="10sp" />
<com.example.jingdong.ui.widget.AddSubView
android:id="@+id/addsubcar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginRight="3dp"></com.example.jingdong.ui.widget.AddSubView>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
9.自定义加减器AddSubView
package com.example.jingdong.ui.widget;
import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.jingdong.R;
public class AddSubView extends LinearLayout {
private TextView tv_productSub;
private TextView tv_productNum;
private TextView tv_productAdd;
public AddSubView(Context context) {
this(context, null);
}
public AddSubView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
View view = LayoutInflater.from(context).inflate(R.layout.add_sub_view, this);
tv_productSub=view.findViewById(R.id.tv_productSub);
tv_productNum=view.findViewById(R.id.tv_productNum);
tv_productAdd=view.findViewById(R.id.tv_productAdd);
}
public String getNum() {
return tv_productNum.getText().toString();
}
public void setNum(String str) {
tv_productNum.setText(str);
}
//给加号设置点击事件
public void setAddOnclickListener(OnClickListener onclickListener){
tv_productAdd.setOnClickListener(onclickListener);
}
//给减号设置点击事件
public void setSubOnclickListener(OnClickListener onclickListener){
tv_productSub.setOnClickListener(onclickListener);
}
}
10.自定义加减器AddSubView布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_productSub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/cart_biankuang"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:text="-"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_productNum"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/cart_biankuang"
android:paddingLeft="3dp"
android:paddingRight="3dp"
android:text="12"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_productAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/cart_biankuang"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:text="+"
android:textSize="12sp" />
</LinearLayout>
11.加减器边框shape
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#ffffff" />
<stroke
android:width="0.1dp"
android:color="#000000" />
</shape>
12.商家的bean类
package com.example.jingdong.bean;
public class SellerBean {
private String sellerName;
private String sellerid;
private boolean selected;//商家是否选中
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
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;
}
}