依赖
compile 'com.jakewharton:butterknife:8.5.1'
compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile 'org.greenrobot:eventbus:3.0.0'
compile 'com.squareup.retrofit2:retrofit:2.4.0'
compile 'com.squareup.retrofit2:converter-gson:2.4.0'
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'org.greenrobot:greendao:3.2.0'
compile 'com.fynn.fluidlayout:fluidlayout:1.0'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
compile 'com.android.support:design:26.0.0-alpha1'
compile 'com.jcodecraeer:xrecyclerview:1.5.2'
testCompile 'junit:junit:4.12'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
权限
<uses-permission android:name="android.permission.INTERNET" />
utils
RetrofitUtils
public class RetrofitUtils {
private static RetrofitUtils retrofitUtils=null;
private final Retrofit retrofit;
public RetrofitUtils() {
OkHttpClient.Builder okHttpClient = new OkHttpClient.Builder().addInterceptor(new CommonInterceptor());
okHttpClient.readTimeout(3000, TimeUnit.SECONDS);
okHttpClient.connectTimeout(3000,TimeUnit.SECONDS);
retrofit = new Retrofit.Builder()
.baseUrl(HttpApi.BaseUrl)
.client(okHttpClient.build())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
public static RetrofitUtils getInstance(){
if(null==retrofitUtils){
synchronized (RetrofitUtils.class){
if(null==retrofitUtils){
retrofitUtils=new RetrofitUtils();
}
}
}
return retrofitUtils;
}
public Api getApi(){
return retrofit.create(Api.class);
}
}
httpConfig
Api
@GET(HttpApi.CheckCarUrl)
Observable<ShopCarBean> getCars(@Query("uid") String uid);
@GET(HttpApi.DelCarUrl)
Observable<DelCarBean> getDels(@Query("uid") String uid, @Query("pid") String pid);
@GET(HttpApi.GoodsUrl)
Observable<GoodsBean> getGoods(@Query("pscid") String pscid, @Query("page") String page);
@GET(HttpApi.InfoUrl)
Observable<InfoBean> getInfo(@Query("pid") String pid);
@GET(HttpApi.AddCarUrl)
Observable<AddCarBean> addCar(@Query("uid") String uid, @Query("pid") String pid);
@GET(HttpApi.SearchUrl)
Observable<SearchBean> search(@Query("keywords") String keywords);
HttpApi
public class HttpApi {
public static final String BaseUrl="https://www.zhaoapi.cn/";
public static final String CheckCarUrl="product/getCarts";
public static final String DelCarUrl="product/deleteCart";
public static final String GoodsUrl="product/getProducts";
public static final String InfoUrl="product/getProductDetail";
public static final String AddCarUrl="product/addCart";
public static final String SearchUrl="product/searchProducts";
}
IGWCModel
public interface IGWCModel {
void getCar(String uid, IGWCPresenter igwcPresenter);
void delCar(String uid, String pid, IGWCPresenter igwcPresenter);
}
GWCModel
public class GWCModel implements IGWCModel {
@Override
public void getCar(String uid, final IGWCPresenter igwcPresenter) {
Observable<ShopCarBean> cars = RetrofitUtils.getInstance().getApi().getCars(uid);
cars.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ShopCarBean>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ShopCarBean value) {
List<ShopCarBean.DataBean> data = value.getData();
igwcPresenter.onSuccess(data);
}
@Override
public void onError(Throwable e) {
igwcPresenter.onFailed(e.getMessage());
}
@Override
public void onComplete() {
}
});
}
@Override
public void delCar(String uid, String pid, final IGWCPresenter igwcPresenter) {
Observable<DelCarBean> dels = RetrofitUtils.getInstance().getApi().getDels(uid, pid);
dels.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<DelCarBean>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(DelCarBean value) {
String msg = value.getMsg();
igwcPresenter.delSuccess(msg);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
}
IGWCPresenter
public interface IGWCPresenter {
void getCarUid(String uid);
void onSuccess(List<ShopCarBean.DataBean> data);
void onFailed(String error);
void onDestory();
void getDelCar(String uid, String pid);
void delSuccess(String msg);
}
GWCPresenter
public class GWCPresenter implements IGWCPresenter {
private static final String TAG ="GWCPresenter----" ;
private IGWCView igwcView;
private final GWCModel gwcModel;
public GWCPresenter(IGWCView igwcView) {
this.igwcView = igwcView;
gwcModel = new GWCModel();
}
@Override
public void getCarUid(String uid) {
gwcModel.getCar(uid,this);
}
@Override
public void onSuccess(List<ShopCarBean.DataBean> data) {
igwcView.showCarData(data);
}
@Override
public void onFailed(String error) {
Log.d(TAG, "onFailed: "+error);
}
@Override
public void onDestory() {
if(null!=igwcView){
igwcView=null;
}
}
@Override
public void getDelCar(String uid, String pid) {
gwcModel.delCar(uid,pid,this);
}
@Override
public void delSuccess(String msg) {
igwcView.delCarData(msg);
}
}
MainActivity
public class MainActivity extends AppCompatActivity implements IGWCView, MyExpandAdapter.CheckGroupItemListener, MyExpandAdapter.ModifyGoodsItemListener {
private static final String TAG ="MainActivity---" ;
private MyExpandAdapter adapter;
private TextView tvAllPrice;
private TextView btnAmount;
private TextView btnEditor;
private CheckBox btnCheckAll;
private ExpandableListView expandList;
private List<ShopCarBean.DataBean> list=new ArrayList<>();
private boolean flag;
private int totalNum = 0;
private double totalPrice= 0.00;
private GWCPresenter gwcPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().hide();
setContentView(R.layout.activity_main);
initView();
gwcPresenter = new GWCPresenter(this);
gwcPresenter.getCarUid("13576");
adapter = new MyExpandAdapter(list,this);
expandList.setAdapter(adapter);
adapter.setCheckGroupItemListener(this);
adapter.setModifyGoodsItemListener(this);
btnCheckAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isChoosedAll(((CheckBox)view).isChecked());
checkPrice();
}
});
btnEditor.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(!flag){
flag=true;
btnEditor.setText("完成");
adapter.showDeleteButton(flag);
}else{
flag=false;
btnEditor.setText("编辑");
adapter.showDeleteButton(flag);
}
}
});
}
private void initView() {
expandList = (ExpandableListView) findViewById(R.id.expandList);
btnCheckAll = (CheckBox) findViewById(R.id.btnCheckAll);
tvAllPrice = (TextView) findViewById(R.id.tvAllPrice);
btnAmount = (TextView) findViewById(R.id.btnAmount);
btnEditor = (TextView) findViewById(R.id.btnEditor);
}
@Override
public void showCarData(List<ShopCarBean.DataBean> data) {
list.addAll(data);
Log.d(TAG, "showCarData: "+data);
for(int i=0;i<data.size();i++){
expandList.expandGroup(i);
}
}
@Override
public void delCarData(String msg) {
Toast.makeText(MainActivity.this,msg.toString(),Toast.LENGTH_SHORT).show();
}
@Override
public void checkGroupItem(int groupPosition, boolean isChecked) {
ShopCarBean.DataBean dataBean = list.get(groupPosition);
dataBean.setGroupChoosed(isChecked);
for(ShopCarBean.DataBean.ListBean listBean:dataBean.getList()){
listBean.setChildChoosed(isChecked);
}
if(isCheckAll()){
btnCheckAll.setChecked(true);
}else{
btnCheckAll.setChecked(false);
}
adapter.notifyDataSetChanged();
checkPrice();
}
@Override
public void checkChildItem(int groupPosition, int childPosition, boolean isChecked) {
ShopCarBean.DataBean dataBean = list.get(groupPosition);
ShopCarBean.DataBean.ListBean listBean = list.get(groupPosition).getList().get(childPosition);
listBean.setChildChoosed(isChecked);
boolean goodsCheckAll = isGoodsCheckAll(groupPosition);
if(goodsCheckAll){
dataBean.setGroupChoosed(goodsCheckAll);
}else{
dataBean.setGroupChoosed(goodsCheckAll);
}
if(isCheckAll()){
btnCheckAll.setChecked(true);
}else {
btnCheckAll.setChecked(false);
}
adapter.notifyDataSetChanged();
checkPrice();
}
private boolean isGoodsCheckAll(int groupPosition){
List<ShopCarBean.DataBean.ListBean> lists = this.list.get(groupPosition).getList();
for(ShopCarBean.DataBean.ListBean list:lists ){
if(list.isChildChoosed()){
continue;
}else {
return false;
}
}
return true;
}
private boolean isCheckAll(){
for(ShopCarBean.DataBean dataBean:list){
if(!dataBean.isGroupChoosed()){
return false;
}
}
return true;
}
private void isChoosedAll(boolean isChecked){
for(ShopCarBean.DataBean dataBean:list){
dataBean.setGroupChoosed(isChecked);
for(ShopCarBean.DataBean.ListBean listBean:dataBean.getList()){
listBean.setChildChoosed(isChecked);
}
}
adapter.notifyDataSetChanged();
}
@Override
public void doIncrease(int groupPosition, int childPosition, View view) {
ShopCarBean.DataBean.ListBean listBean = list.get(groupPosition).getList().get(childPosition);
int num = listBean.getNum();
num++;
listBean.setNum(num);
adapter.notifyDataSetChanged();
checkPrice();
}
@Override
public void doDecrease(int groupPosition, int childPosition, View view) {
ShopCarBean.DataBean.ListBean listBean = list.get(groupPosition).getList().get(childPosition);
int num = listBean.getNum();
if(num==1){
return;
}
num--;
listBean.setNum(num);
adapter.notifyDataSetChanged();
checkPrice();
}
@Override
public void deleteItem(int groupPosition, int childPosition, int pid) {
gwcPresenter.getDelCar("13576",pid+"");
list.get(groupPosition).getList().remove(childPosition);
if (list.get(groupPosition).getList().size() == 0) {
list.remove(groupPosition);
}
adapter.notifyDataSetChanged();
checkPrice();
}
private void checkPrice(){
totalNum=0;
totalPrice=0;
for(ShopCarBean.DataBean dataBean:list){
for(ShopCarBean.DataBean.ListBean listBean:dataBean.getList()){
if(listBean.isChildChoosed()){
totalNum++;
totalPrice+=listBean.getNum()*listBean.getPrice();
}
}
}
tvAllPrice.setText("合计:¥"+totalPrice);
btnAmount.setText("结算("+totalNum+")");
}
}
MyExpandAdapter
public class MyExpandAdapter extends BaseExpandableListAdapter{
private List<ShopCarBean.DataBean> list;
private Context context;
private CheckGroupItemListener checkGroupItemListener;
private ModifyGoodsItemListener modifyGoodsItemListener;
private boolean isEditor;
public void showDeleteButton(boolean isEditor){
this.isEditor=isEditor;
notifyDataSetChanged();
}
public void setCheckGroupItemListener(CheckGroupItemListener checkGroupItemListener) {
this.checkGroupItemListener = checkGroupItemListener;
}
public void setModifyGoodsItemListener(ModifyGoodsItemListener modifyGoodsItemListener) {
this.modifyGoodsItemListener = modifyGoodsItemListener;
}
public MyExpandAdapter(List<ShopCarBean.DataBean> list, Context context) {
this.list = list;
this.context = context;
}
@Override
public int getGroupCount() {
return list!=null?list.size():0;
}
@Override
public int getChildrenCount(int i) {
return list!=null&&list.get(i).getList()!=null?list.get(i).getList().size():0;
}
@Override
public Object getGroup(int groupPosition) {
return list.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return list.get(groupPosition).getList().get(childPosition);
}
@Override
public long getGroupId(int i) {
return i;
}
@Override
public long getChildId(int i, int i1) {
return i1;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(final int i, boolean b, View view, ViewGroup viewGroup) {
GroupViewHolder groupViewHolder;
if(view==null){
view= view.inflate(context, R.layout.layout_group, null);
groupViewHolder = new GroupViewHolder();
groupViewHolder.groudCheckbox=view.findViewById(R.id.group_choosed);
view.setTag(groupViewHolder);
}else{
groupViewHolder = (GroupViewHolder) view.getTag();
}
groupViewHolder.groudCheckbox.setText(list.get(i).getSellerName());
if(list.get(i).isGroupChoosed()){
groupViewHolder.groudCheckbox.setChecked(true);
}else {
groupViewHolder.groudCheckbox.setChecked(false);
}
groupViewHolder.groudCheckbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
checkGroupItemListener.checkGroupItem(i,((CheckBox)view).isChecked());
}
});
return view;
}
@Override
public View getChildView(final int i, final int i1, boolean b, View view, ViewGroup viewGroup) {
final ChildViewHolder childViewHolder ;
if(view==null){
view= view.inflate(context, R.layout.layout_child, null);
childViewHolder = new ChildViewHolder();
childViewHolder.childCheckbox= view.findViewById(R.id.child_choosed);
childViewHolder.img=view.findViewById(R.id.img);
childViewHolder.titleName=view.findViewById(R.id.titleName);
childViewHolder.littleTitle=view.findViewById(R.id.littleTitle);
childViewHolder.price=view.findViewById(R.id.price);
childViewHolder.count=view.findViewById(R.id.count);
childViewHolder.btnSub=view.findViewById(R.id.btnSub);
childViewHolder.btnAdd=view.findViewById(R.id.btnAdd);
childViewHolder.showNum=view.findViewById(R.id.showNum);
childViewHolder.delete=view.findViewById(R.id.delete);
view.setTag(childViewHolder);
}else {
childViewHolder = (ChildViewHolder) view.getTag();
}
childViewHolder.titleName.setText(list.get(i).getList().get(i1).getTitle());
childViewHolder.littleTitle.setText(list.get(i).getList().get(i1).getSubhead());
childViewHolder.price.setText("¥"+list.get(i).getList().get(i1).getPrice());
childViewHolder.count.setText("x"+list.get(i).getList().get(i1).getNum());
childViewHolder.showNum.setText(list.get(i).getList().get(i1).getNum()+"");
String images = list.get(i).getList().get(i1).getImages();
String[] split = images.split("\\|");
Glide.with(context).load(split[0]).into(childViewHolder.img);
if(list.get(i).getList().get(i1).isChildChoosed()){
childViewHolder.childCheckbox.setChecked(true);
}else {
childViewHolder.childCheckbox.setChecked(false);
}
childViewHolder.childCheckbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
checkGroupItemListener.checkChildItem(i,i1,((CheckBox)view).isChecked());
}
});
childViewHolder.btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
modifyGoodsItemListener.doIncrease(i,i1,childViewHolder.showNum);
}
});
childViewHolder.btnSub.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
modifyGoodsItemListener.doDecrease(i,i1,childViewHolder.showNum);
}
});
childViewHolder.delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
modifyGoodsItemListener.deleteItem(i,i1,list.get(i).getList().get(i1).getPid());
notifyDataSetChanged();
}
});
if(isEditor){
childViewHolder.delete.setVisibility(View.VISIBLE);
}else{
childViewHolder.delete.setVisibility(View.GONE);
}
return view;
}
@Override
public boolean isChildSelectable(int i, int i1) {
return false;
}
class GroupViewHolder{
CheckBox groudCheckbox;
}
class ChildViewHolder{
CheckBox childCheckbox;
ImageView img;
TextView titleName;
TextView littleTitle ;
TextView price ;
TextView count ;
TextView btnSub ;
TextView showNum ;
TextView btnAdd ;
Button delete;
}
public interface CheckGroupItemListener{
void checkGroupItem(int groupPosition,boolean isChecked);
void checkChildItem(int groupPosition,int childPosition, boolean isChecked);
}
public interface ModifyGoodsItemListener{
void doIncrease(int groupPosition,int childPosition,View view);
void doDecrease(int groupPosition,int childPosition,View view);
void deleteItem(int groupPosition,int childPosition,int pid);
}
}
CommonInterceptor
public class CommonInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
HttpUrl httpUrl = request
.url()
.newBuilder()
.addQueryParameter("source", "android")
.build();
Request requestNew = request
.newBuilder()
.url(httpUrl)
.build();
return chain.proceed(requestNew);
}
}