retrofit/实现购物车功能

//依赖

compile 'com.facebook.fresco:webpsupport:0.12.0'
compile 'com.youth.banner:banner:1.4.9'
compile 'io.reactivex.rxjava2:rxjava:2.1.7'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.jakewharton:butterknife:8.8.1'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'com.github.bumptech.glide:glide:4.3.1'
compile 'com.android.support:recyclerview-v7:26.+'
compile 'com.facebook.fresco:fresco:1.2.0'
compile 'com.facebook.fresco:animated-base-support:0.12.0'
compile 'com.facebook.fresco:animated-gif:0.12.0'
compile 'com.facebook.fresco:animated-webp:0.12.0'
compile 'com.facebook.fresco:webpsupport:0.12.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
compile 'org.greenrobot:eventbus:3.1.1'
android:theme="@style/Theme.AppCompat.Light.NoActionBar"> <!-- 隐藏标题栏 -->

//Http

public class RetrofitUtils {
    private static volatile RetrofitUtils instance;
    private final Retrofit retrofit;

    private RetrofitUtils(){
        retrofit = new Retrofit.Builder()
                .baseUrl("http://120.27.23.105")
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        Log.i("retroifit",retrofit+"");
    }

    public static RetrofitUtils getInstance(){
        if(instance==null){
            synchronized (RetrofitUtils.class){
                if(instance==null){
                    instance=new RetrofitUtils();
                }
            }
        }
        return instance;
    }


    public UtilsPost getApiservise(){
        return retrofit.create(UtilsPost.class);
    }
}

=======================================================================================

public interface UtilsPost {
    @GET("/product/getCarts")
    Flowable<DataBeans> getVideo2(@QueryMap Map<String, String> map);

    @GET("/product/deleteCart")
    Flowable<deletebean> getVideo(@QueryMap Map<String, String> map);
}
==========================================================================================

//model

public class Models implements ModelPost {
    private PlayPresenter playPresenter;


    public Models(PlayPresenter playPresenter) {
        this.playPresenter = playPresenter;
    }

    @Override
    public void getData(Map<String, String> map) {
        Flowable<DataBeans> video2 = RetrofitUtils.getInstance().getApiservise().getVideo2(map);
        Log.i("fff",video2+"");
        playPresenter.get2(video2);
    }
}
=============================================================================

public interface ModelPost {
    void getData(Map<String, String> map);
}
===============================================================================

//presenter

public class PlayPresenter implements PresenterPost {
    private Iview iview;
    private DisposableSubscriber<DataBeans> subscriber;
    private List<Goodsuser> list;
    private List<List<Goodsuser2>> list2;

    public PlayPresenter(Iview iview, List<Goodsuser> list, List<List<Goodsuser2>> list2) {
        this.iview = iview;
        this.list = list;
        this.list2 = list2;
    }

    @Override
    public void getData2(Map<String, String> map) {
        Models model = new Models(this);
        Log.i("mmm",map+"");
        model.getData(map);
    }
//绑定
public void detachView() {
    if (iview != null) {
        iview = null;
    }
    if (disposableSubscriber != null) {
        if (!disposableSubscriber.isDisposed()) {
            disposableSubscriber.dispose();
        }
    }
}
public void get2(Flowable<DataBeans> getVideo){ subscriber= getVideo.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableSubscriber<DataBeans>() { @Override public void onNext(DataBeans retBean2) { if(retBean2!=null){ List<DataBeans.DataBean> data = retBean2.getData(); for (int i=0;i<data.size();i++){ String sellerName = data.get(i).getSellerName(); list.add(new Goodsuser(false,sellerName)); List<DataBeans.DataBean.ListBean> list = data.get(i).getList(); List<Goodsuser2> list1=new ArrayList<Goodsuser2>(); for (int j = 0; j<list.size(); j++){ String title = list.get(j).getTitle(); String images = list.get(j).getImages(); double price = list.get(j).getPrice(); int pid = list.get(j).getPid(); list1.add(new Goodsuser2(title,images,price,1,false,pid)); } list2.add(list1); } } iview.onSuccess2(list,list2); } @Override public void onError(Throwable t) { iview.onFailed2(new Exception(t)); } @Override public void onComplete() { } }); }}
==================================================================================

public interface PresenterPost {
    void getData2(Map<String, String> map);
}
=====================================================================================

//加减器

public class AddDleneteView extends LinearLayout {
    private OnAddDelClickListener listener;
    public EditText etNumber;

    //对外提供一个点击的回调接口
    public interface OnAddDelClickListener{
        void onAddClick(View v);
        void onDelClick(View v);
    }

    public void setOnAddDelClickListener(OnAddDelClickListener listener){
        if(listener!=null){
            this.listener=listener;
        }
    }

    public AddDleneteView(Context context) {
        this(context,null);
    }

    public AddDleneteView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public AddDleneteView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView(context, attrs, defStyleAttr);
    }

    private void initView(Context context, AttributeSet attrs, int defStyleAttr) {
        View.inflate(context, R.layout.layout_tiem,this);

        //获取控件
        TextView txtDelete=findViewById(R.id.txt_delete);
        TextView txtAdd=findViewById(R.id.txt_add);
        etNumber = findViewById(R.id.et_number);


        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AddDeleteViewStyle);

        String leftText = typedArray.getString(R.styleable.AddDleneteView_left_text);
        String rightText = typedArray.getString(R.styleable.AddDleneteView_right_text);
        String middleText = typedArray.getString(R.styleable.AddDleneteView_middle_text);
        int color = typedArray.getColor(R.styleable.AddDleneteView_left_text_color, Color.BLACK);

        txtDelete.setText(leftText);
        txtAdd.setText(rightText);
        etNumber.setText(middleText);
        txtDelete.setTextColor(color);
        //回收
        typedArray.recycle();
        txtDelete.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                listener.onDelClick(view);
            }
        });

        txtAdd.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                listener.onAddClick(view);
            }
        });
    }
    //对外提供一个修改数字的方法
    public void setNumber(int number){
        if(number>0){
            etNumber.setText(number+"");
        }
    }
    //对外提供一个获取当前数字的方法
    public int getNumber(){
        String string = etNumber.getText().toString();
        int i = Integer.parseInt(string);
        return i;
    }
}
======
public interface Iview {
    void onSuccess2(List<Goodsuser> list, List<List<Goodsuser2>> list2);
    void onFailed2(Exception e);
}

============================================================================

//attrs

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="AddDleneteView">
        <attr name="left_text" format="string"></attr>
        <attr name="right_text" format="string"></attr>
        <attr name="middle_text" format="string"></attr>
        <attr name="left_text_color" format="color"></attr>
    </declare-styleable>
    <declare-styleable name="AddDeleteViewStyle"></declare-styleable>
</resources>
===============================================================================

//加减器布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    >
    <TextView
        android:id="@+id/txt_delete"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:text="-"
        android:gravity="center"
        android:background="#e4a022"/>

    <EditText
        android:id="@+id/et_number"
        android:layout_marginTop="2dp"
        android:layout_width="50dp"
        android:layout_height="30dp"
        android:background="#f2efef"
        android:gravity="center"
        android:text="1"
        android:inputType="number"
        />
    <TextView
        android:id="@+id/txt_add"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:text="+"
        android:gravity="center"
        android:background="#d59216"/>
</LinearLayout>
===================

<bwei.com.shopingcart.view.AddDleneteView
    android:id="@+id/adv"
    android:layout_width="160dp"
    android:layout_height="30dp"
    android:layout_marginTop="30dp"
    android:layout_marginLeft="140dp"
    app:left_text="-"
    app:right_text="+"
    app:middle_text="1"
    android:focusable="false"
    ></bwei.com.shopingcart.view.AddDleneteView>
==================================================================

//Adapater

public class Goods extends BaseExpandableListAdapter {
    private Context context;
    private List<Goodsuser> list;
    private List<List<Goodsuser2>> list2;
    MainActivity con;
    public Goods(Context context, List<Goodsuser> list, List<List<Goodsuser2>> list2) {
        this.context = context;
        this.list = list;
        this.list2 = list2;
        con= (MainActivity) context;
    }


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

    @Override
    public int getChildrenCount(int i) {
        return list2.get(i).size();
    }

    @Override
    public Object getGroup(int i) {
        return list.get(i);
    }

    @Override
    public Object getChild(int i, int i1) {
        return list2.get(i).get(i1).getTitle();
    }

    @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 position, boolean b, View view, ViewGroup viewGroup) {
        final GroupViewHolder holder;
        if(view==null){
            holder = new GroupViewHolder();
            view=view.inflate(context, R.layout.layout_suer,null);
            holder.cb=(CheckBox)view.findViewById(R.id.cb1);
            holder.tv=(TextView)view.findViewById(R.id.titles);
            view.setTag(holder);
        }else{
            holder=(GroupViewHolder)view.getTag();
        }
        holder.cb.setChecked(list.get(position).isCb1());
        holder.tv.setText(list.get(position).getName());

        holder.cb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //首先获取到父级的选中状态
                boolean checked1 = holder.cb.isChecked();
                //将状态值添加进存放父级的集合
                list.get(position).setCb1(checked1);
                //获取到Activity,方便对全选做操作
                MainActivity con=(MainActivity)context;
                //遍历父级的集合
                for (Goodsuser i:list){
                    //取出我们添加在集合的一个布尔值
                    boolean item1_cb = i.isCb1();
                    //如果我们的父级其中有一条没有被选中
                    if(!item1_cb){
                        //那么我们的总的全选按钮就不勾选
                        con.ck_all.setChecked(false);
                        break;//必选加,否则会出现去掉父级的按钮全选按钮就不会被取消
                    }else{
                        con.ck_all.setChecked(true);
                    }
                }
                con.changesum(list2);
                //获取到我们子级的集合长度
                int size = list2.get(position).size();
                //如果我们的父级全部被选中
                if(checked1){
                    //那么你就遍历子级的长度
                    for (int j=0;j<size;j++){
                        //将我们的子级全部都选中
                        list2.get(position).get(j).setCb2(true);
                    }
                }else{
                    for (int j=0;j<size;j++){
                        list2.get(position).get(j).setCb2(false);
                    }
                }
                //刷新我们的适配器
                notifyDataSetChanged();
                con.changesum(list2);
            }
        });
        return view;
    }

    @Override
    public View getChildView(final int i, final int i1, boolean b, View view, ViewGroup viewGroup) {
        final ChildViewHolder holder;

        if(view==null){
            holder=new ChildViewHolder();
            view=view.inflate(context,R.layout.layout_suertow,null);
            holder.rv=view.findViewById(R.id.tittle);
            holder.item_img66=view.findViewById(R.id.img);
            holder.item_price=view.findViewById(R.id.price3);
            holder.item_cb=view.findViewById(R.id.cb2);
            holder.txt_delete=view.findViewById(R.id.txt_delete);
            holder.txt_add=view.findViewById(R.id.txt_add);
            holder.txt_delete.setText("-");
            holder.txt_add.setText("+");
            holder.jiajia=view.findViewById(R.id.adv);
            holder.jiajia.setNumber(list2.get(i).get(i1).getNum());

            holder.jiajia.setOnAddDelClickListener(new AddDleneteView.OnAddDelClickListener() {
                @Override
                public void onAddClick(View v) {
                    int number = holder.jiajia.getNumber();
                    number++;
                    holder.jiajia.setNumber(number);
                    list2.get(i).get(i1).setNum(number);
                    Log.e("-----jia",number+"");
                    con.changesum(list2);

                }
                @Override
                public void onDelClick(View v) {
                    int number = holder.jiajia.getNumber();
                    number--;
                    holder.jiajia.setNumber(number);
                    list2.get(i).get(i1).setNum(number);
                    Log.e("-----建",number+"");
                    notifyDataSetChanged();
                    con.changesum(list2);
                }
            });
            view.setTag(holder);
        }else{
            holder=(ChildViewHolder)view.getTag();
        }
        holder.rv.setText(list2.get(i).get(i1).getTitle());
        String images =list2.get(i).get(i1).getImg();
        String[] split = images.split("\\|");
        Glide.with(context).load(split[0]).into(holder.item_img66);
        holder.item_price.setText(list2.get(i).get(i1).getPrice()+"");
        holder.item_cb.setChecked(list2.get(i).get(i1).isCb2());
        holder.item_cb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //定义一个flag用于跳出循环
                boolean flag=false;
                //获取我们子级的选中状态
                boolean checked = holder.item_cb.isChecked();
                //将选中状态返回给我们存放子级的集合中
                list2.get(i).get(i1).setCb2(checked);
                //获取到Activity
                MainActivity con=(MainActivity)context;
                //循环我们的子级集合
                for (List<Goodsuser2> i1:list2){
                    //循环第二层的集合
                    for (int j=0;j<i1.size();j++){
                        //获取到子级条目数的选中状态
                        boolean chokx = i1.get(j).isCb2();
                        //如果我们的子级条目有一条未被选中
                        if(!chokx){
                            //那么就让我们的全选按钮为未选中
                            con.ck_all.setChecked(false);
                            //同时将父级的按钮也变为未选中
                            list.get(i).setCb1(false);
                            //flag为true,跳出本层的循环
                            flag=true;
                            break;
                        }else{
                            con.ck_all.setChecked(true);
                            list.get(i).setCb1(true);
                        }
                    }
                    if (flag){
                        break;
                    }
                }
                con.changesum(list2);
                //遍历每一个父级下面的子级集合判断
                //获取到子级的集合长度
                int size = list2.get(i).size();
                //遍历子级集合
                for (int e=0;e<size;e++){
                    //获取到子级的选中状态
                    boolean chokx = list2.get(i).get(e).isCb2();
                    //如果子级有一条未被选中
                    if(!chokx){
                        //那么我们的父级按钮就不会被选中
                        list.get(i).setCb1(false);
                        break;
                    }else{
                        list.get(i).setCb1(true);
                    }
                }
                notifyDataSetChanged();
                con.changesum(list2);
            }
        });

        return view;
    }
    @Override
    public boolean isChildSelectable(int i, int i1) {
        return false;
    }
    class GroupViewHolder {
        CheckBox cb;
        TextView tv;
    }
    class ChildViewHolder {
        TextView rv;
        ImageView item_img66;
        TextView item_price;
        TextView txt_delete;
        TextView et_number;
        TextView txt_add;
        CheckBox item_cb;
        AddDleneteView jiajia;
    }
}

//Activty解绑

//解绑
@Override
protected void onDestroy() {
    super.onDestroy();
    if (dayPresenter != null) {
        dayPresenter.detachView();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值