Fresco+retrofit+rxjava+mvp+电商进阶购物车(wxr)

依赖

compile 'com.squareup.okhttp3:okhttp:3.10.0'
compile 'com.android.support:recyclerview-v7:26.1.0'
//黄油刀
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
//图片加载框架
compile 'com.facebook.fresco:fresco:0.12.0'
//访问网络
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
compile 'com.squareup.retrofit2:converter-gson:2.4.0'
//compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
//RxJava
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'io.reactivex.rxjava2:rxjava:2.1.12'

compile 'com.github.userswlwork:pull-to-refresh:1.0.0'
compile 'com.jcodecraeer:xrecyclerview:1.3.2'
compile 'org.greenrobot:greendao:3.2.2'
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'

compile 'com.github.bumptech.glide:glide:3.7.0'

权限

<uses-permission android:name="android.permission.INTERNET"/>
<application

    android:name=".application.MyApplication">
布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.slx.songliangxing1511r20180423.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:id="@+id/rv">

    </android.support.v7.widget.RecyclerView>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp">

        <CheckBox
            android:id="@+id/cb"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="全选"
            />

        <TextView
            android:id="@+id/price"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="总价:"/>

        <TextView
            android:id="@+id/tv_totalPrice"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="0"/>

        <Button
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="结算"/>

</LinearLayout>
</LinearLayout>
<?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="match_parent"
    android:orientation="horizontal">
    <CheckBox
        android:layout_gravity="center"
        android:id="@+id/lv_checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <com.facebook.drawee.view.SimpleDraweeView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_gravity="center"
        android:id="@+id/lv_img"/>

    <LinearLayout
        android:orientation="vertical"
        android:layout_gravity="center"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/lv_title"
            android:text="标题"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <TextView

                android:id="@+id/lv_price"
                android:text="价格:0.0"
                android:layout_width="120dp"
                android:layout_height="wrap_content" />
            <Button
                android:id="@+id/lv_jian"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:text="-"/>
            <TextView
                android:id="@+id/lv_num"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:text="0"/>
            <Button
                android:id="@+id/lv_jia"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:text="+"/>
        </LinearLayout>


    </LinearLayout>
    <Button
        android:id="@+id/lv_remove"
        android:layout_gravity="center"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:text="删除"/>
</LinearLayout>

bean

public class MessageBean<T>{
    private String msg;
    private String code;
    private List<T> data;
    private String page;
public class Goods {
    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;
    private Boolean flag;

utils

package com.example.slx.songliangxing1511r20180423.utils;

import com.example.slx.songliangxing1511r20180423.http.ApiService;
import com.example.slx.songliangxing1511r20180423.http.ServiceUrl;
import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * Created by lenovo on 2018/4/23.
 */

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

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



    private HttpNetUtils(){
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(interceptor)
                .build();
        retrofit = new Retrofit.Builder()
                .baseUrl(ServiceUrl.BASE_URL)
                .client(client)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();

    }


    public ApiService getService(){
        return retrofit.create(ApiService.class);
    }
}

http

package com.example.slx.songliangxing1511r20180423.http;

/**
 * Created by lenovo on 2018/4/23.
 */

public class ServiceUrl {
    public static final String BASE_URL = "https://www.zhaoapi.cn/product/";

}
package com.example.slx.songliangxing1511r20180423.http;

import com.example.slx.songliangxing1511r20180423.bean.Goods;
import com.example.slx.songliangxing1511r20180423.bean.MessageBean;

import io.reactivex.Flowable;
import retrofit2.http.GET;
import retrofit2.http.Query;

/**
 * Created by lenovo on 2018/4/23.
 */

public interface ApiService {
    @GET("getProducts")
    Flowable<MessageBean<Goods>> getGoodsData(@Query("pscid")String pscid);
}

inter

package com.example.slx.songliangxing1511r20180423.inter;

import com.example.slx.songliangxing1511r20180423.bean.Goods;
import com.example.slx.songliangxing1511r20180423.bean.MessageBean;

/**
 * Created by lenovo on 2018/4/23.
 */

public interface IPresenter {
    void netWork(String pscid);

    void success(MessageBean<Goods> goodsMessageBean);
}
package com.example.slx.songliangxing1511r20180423.inter;

import com.example.slx.songliangxing1511r20180423.bean.Goods;
import com.example.slx.songliangxing1511r20180423.bean.MessageBean;

/**
 * Created by lenovo on 2018/4/23.
 */

public interface IView {
    void toBackHome(MessageBean<Goods> goodsMessageBean);
}

view层

package com.example.slx.songliangxing1511r20180423;

import android.os.Bundle;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;

import com.example.slx.songliangxing1511r20180423.adapter.MyAdapter;
import com.example.slx.songliangxing1511r20180423.bean.Goods;
import com.example.slx.songliangxing1511r20180423.bean.MessageBean;
import com.example.slx.songliangxing1511r20180423.inter.IPresenter;
import com.example.slx.songliangxing1511r20180423.inter.IView;
import com.example.slx.songliangxing1511r20180423.presenter.MyPresenter;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;


public class MainActivity extends AppCompatActivity implements IView,MyAdapter.Change{


    @BindView(R.id.rv)
    RecyclerView rv;
    @BindView(R.id.cb)
    CheckBox cb;
    @BindView(R.id.price)
    TextView price;
    @BindView(R.id.tv_totalPrice)
    TextView tvTotalPrice;

    private List<Goods> list;
    private MyAdapter adapter;
    private CheckBox checkBox;



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


        checkBox = findViewById(R.id.cb);
        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                for (int i = 0; i <list.size() ; i++) {
                    list.get(i).setFlag(b);
                }
                adapter.notifyDataSetChanged();
                getMoney();
            }
        });
        //设置布局文件
        rv.setLayoutManager(new LinearLayoutManager(this));
        //创建p层对象
        IPresenter myPresenter = new MyPresenter(this);
        myPresenter.netWork("2");
    }

    @Override
    public void toBackHome(MessageBean<Goods> goodsMessageBean) {
        list  = goodsMessageBean.getData();

        //给定义的flag赋值,默认false
        for (int i = 0; i <list.size();i++) {
            list.get(i).setFlag(false);
        }

        //4.1实例化一个接口对象
        adapter = new MyAdapter(list,MainActivity.this);
        rv.setAdapter(adapter);
        //4.2传到对象内部

        adapter.getChange(MainActivity.this);
        getMoney();

    }
    public void changeMoney() {
        getMoney();
    }
    public void jiaNum(){
        getMoney();
    }
    public void jianNum(){
        getMoney();
    }
    public void delete(){
        getMoney();
    }
    public void getMoney() {
        double zon=0;
        for (int i = 0; i <list.size() ; i++) {
            Goods goods = list.get(i);
            boolean flag = goods.getFlag();
            if (flag){
                double price = goods.getPrice();
                int sellerid = goods.getSellerid();
                zon+=price*sellerid;
            }
        }
        price.setText("总价:"+zon);
    }
    }

p层

package com.example.slx.songliangxing1511r20180423.presenter;

import com.example.slx.songliangxing1511r20180423.bean.Goods;
import com.example.slx.songliangxing1511r20180423.bean.MessageBean;
import com.example.slx.songliangxing1511r20180423.inter.IPresenter;
import com.example.slx.songliangxing1511r20180423.inter.IView;
import com.example.slx.songliangxing1511r20180423.model.MyModel;

/**
 * Created by lenovo on 2018/4/23.
 */

public class MyPresenter implements IPresenter{
    private IView iView;
    private final MyModel myModel;

    public MyPresenter(IView iView){
        this.iView=iView;
        myModel = new MyModel();
    }

    @Override
    public void netWork(String pscid) {
        myModel.getData(pscid,this);
    }

    @Override
    public void success(MessageBean<Goods> goodsMessageBean) {
        iView.toBackHome(goodsMessageBean);
    }
}

m层

package com.example.slx.songliangxing1511r20180423.model;

import com.example.slx.songliangxing1511r20180423.bean.Goods;
import com.example.slx.songliangxing1511r20180423.bean.MessageBean;
import com.example.slx.songliangxing1511r20180423.http.ApiService;
import com.example.slx.songliangxing1511r20180423.inter.IPresenter;
import com.example.slx.songliangxing1511r20180423.utils.HttpNetUtils;

import io.reactivex.Flowable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import io.reactivex.subscribers.DisposableSubscriber;

/**
 * Created by lenovo on 2018/4/23.
 */

public class MyModel {

    public void getData(String pscid, final IPresenter iPresenter) {
        HttpNetUtils instance = HttpNetUtils.getInstance();
        ApiService service = instance.getService();
        //得到被观察者
        Flowable<MessageBean<Goods>> goodsData = service.getGoodsData(pscid);

        goodsData.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new DisposableSubscriber<MessageBean<Goods>>() {
                    @Override
                    public void onNext(MessageBean<Goods> goodsMessageBean) {
                        iPresenter.success(goodsMessageBean);
                    }

                    @Override
                    public void onError(Throwable t) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }
}

adapter

package com.example.slx.songliangxing1511r20180423.adapter;

import android.content.Context;
import android.net.Uri;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.example.slx.songliangxing1511r20180423.R;
import com.example.slx.songliangxing1511r20180423.bean.Goods;

import java.net.URL;
import java.util.List;

/**
 * Created by lenovo on 2018/4/23.
 */

public class MyAdapter extends RecyclerView.Adapter{
    //2.提供一个接口对象
    private Change change;


    private List<Goods> list;
    private Context context;

    public MyAdapter(List<Goods> list, Context context) {
        this.list = list;
        this.context = context;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = View.inflate(parent.getContext(), R.layout.itemlayout, null);
       // LayoutInflater from = LayoutInflater.from(context);
       // View view = from.inflate(R.layout.itemlayout, parent, false);
        //创建ViewHolder  把view通过构造方法传过去
        MyViewHolder myViewHolder = new MyViewHolder(view);
         return myViewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {

        final MyViewHolder myViewHolder = (MyViewHolder) holder;
        //得到标题
        myViewHolder.lv_title.setText(list.get(position).getTitle());
        //得到图片
        String[] split = list.get(position).getImages().split("!");
        Uri uri = Uri.parse(split[0]);
        myViewHolder.lv_img.setImageURI(uri);
       //得到价格
        myViewHolder.lv_price.setText("价格"+list.get(position).getPrice());
        //得到数量
        myViewHolder.lv_num.setText(list.get(position).getSellerid()+"");
        //加
        myViewHolder.lv_jia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int sellerid = list.get(position).getSellerid();
                sellerid++;
                list.get(position).setSellerid(sellerid);
                notifyDataSetChanged();
                change.jiaNum();

            }
        });
        //减
        myViewHolder.lv_jian.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int sellerid = list.get(position).getSellerid();
                if (sellerid==1){
                    myViewHolder.lv_jian.setFocusable(false);
                }else {

                    sellerid--;
                }
                list.get(position).setSellerid(sellerid);
                notifyDataSetChanged();
                change.jianNum();
            }
        });
        myViewHolder.lv_remove.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                list.remove(position);
                notifyDataSetChanged();
                change.delete();
            }
        });
        myViewHolder.lv_checkbox.setChecked(list.get(position).getFlag());
        myViewHolder.lv_checkbox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                list.get(position).setFlag(!list.get(position).getFlag());
                //添加一个触发事件
                change.changeMoney();
            }
        });
    }

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

    //内部类创建V,在此方法中,寻找控件
    class MyViewHolder extends RecyclerView.ViewHolder{
        private final TextView lv_title;
        private CheckBox lv_checkbox;
        private ImageView lv_img;
        private Button lv_jia;
        private Button lv_jian;
        private Button lv_remove;
        private TextView lv_num;
        private TextView lv_price;
        public MyViewHolder(View view) {
            super(view);
            lv_title = view.findViewById(R.id.lv_title);
            lv_checkbox = view.findViewById(R.id.lv_checkbox);
            lv_img = view.findViewById(R.id.lv_img);
            lv_jia = view.findViewById(R.id.lv_jia);
            lv_jian = view.findViewById(R.id.lv_jian);
            lv_remove = view.findViewById(R.id.lv_remove);
            lv_num = view.findViewById(R.id.lv_num);
            lv_price = view.findViewById(R.id.lv_price);
        }
    }



    //1.定义一个接口
    public interface Change{
        void changeMoney();
        void jiaNum();
        void jianNum();
        void delete();
    }
    //3.提供一个为接口对象赋值的方法
    public void getChange(Change change){
        this.change = change;
    }
}

application

package com.example.slx.songliangxing1511r20180423.application;

import android.app.Application;

import com.facebook.drawee.backends.pipeline.Fresco;

/**
 * Created by lenovo on 2018/4/23.
 */

public class MyApplication extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
    }
}

猜你喜欢

转载自blog.csdn.net/love_xxxooo/article/details/80059218
今日推荐