依赖
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' compile "io.reactivex.rxjava2:rxjava:2.1.10" compile 'io.reactivex.rxjava2:rxandroid:2.0.2' compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0' compile 'com.jcodecraeer:xrecyclerview:1.5.8' compile 'com.facebook.fresco:fresco:0.12.0'http包
public class HttpConfig { public static String base_url="http://120.27.23.105/"; }工具类
public class RetrofitUtil { //单例模式 private static RetrofitUtil retrofitUtil; private final Retrofit retrofit; public static RetrofitUtil getInstance(){ if (retrofitUtil==null){ retrofitUtil=new RetrofitUtil(); } return retrofitUtil; } //初始化retrofit public RetrofitUtil(){ retrofit = new Retrofit.Builder() .baseUrl(HttpConfig.base_url) .addConverterFactory(GsonConverterFactory.create(new Gson())) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); } public <T> T createService(Class<T> t){ T t1 = retrofit.create(t); return t1; } }服务类
public interface MyService { //登录 @FormUrlEncoded @POST("user/login") Observable<LoginBean> loginPost(@FieldMap Map<String,String> map); //注册 @FormUrlEncoded @POST("user/reg") Observable<RegBean> regPost(@FieldMap Map<String,String> map); //商品列表 @GET("product/getProducts") Observable<GoodsBean> goodListData(@Query("pscid") String pscid,@Query("page") String page); //商品详情 @GET("product/getProductDetail") Observable<DetailBean> goodDetailBean(@FieldMap Map<String,String> map); //添加购物车 @GET("product/addCart") Observable<AddCartBean> addCart(@Query("uid") String uid,@Query("pid") String pid,@Query("source") String source); //获取购物车 @FormUrlEncoded @POST("product/getCarts") Observable<CartGoodBean> getCartGood(@FieldMap Map<String,String> map); }model层
public interface IModel { //登录 void login(Map<String,String> map); //注册 void reg(Map<String,String> map); //获取商品列表 void getGoodsListData(String pscid,String page); void getGoodsListFresh(String pscid,String page); void getGoodsListLoadMore(String pscid,String page); //获取商品详情 void getGoodsDetail(DetailBean.DataBean dataBean); //添加购物车 void addCart(String uid,String pid,String source); //获取购物车列表 void getCart(Map<String,String> map); }m实现类
public class ModelImpl implements IModel { private IPresenter iPresenter; private static final String TAG = "ModelImpl======"; public ModelImpl(IPresenter iPresenter) { this.iPresenter = iPresenter; } @Override public void login(Map<String, String> map) { RetrofitUtil retrofitUtil = RetrofitUtil.getInstance(); MyService myService = retrofitUtil.createService(MyService.class); myService.loginPost(map) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<LoginBean>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(LoginBean loginBean) { if (loginBean.getCode().equals("0")){ iPresenter.getLogin(loginBean); }else { iPresenter.getErrorData("请注册"); } } @Override public void onError(Throwable e) { iPresenter.getErrorData(e.getMessage()); } @Override public void onComplete() { Log.d(TAG, "onComplete: 完成----"); } }); } @Override public void reg(Map<String, String> map) { RetrofitUtil retrofitUtil = RetrofitUtil.getInstance(); MyService myService = retrofitUtil.createService(MyService.class); myService.regPost(map) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<RegBean>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(RegBean regBean) { if (regBean.getCode().equals("0")){ iPresenter.getReg(regBean); }else { iPresenter.getRegError(regBean.getMsg()); } } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } @Override public void getGoodsListData(String pscid, String page) { RetrofitUtil retrofitUtil = RetrofitUtil.getInstance(); MyService myService = retrofitUtil.createService(MyService.class); myService.goodListData(pscid,page) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<GoodsBean>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(GoodsBean goodsBean) { if (goodsBean.getCode().equals("0")){ iPresenter.getGoodsListData(goodsBean.getData()); }else { Log.d(TAG, "onNext: aaa"+goodsBean); } } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } @Override public void getGoodsListFresh(String pscid, String page) { RetrofitUtil retrofitUtil = RetrofitUtil.getInstance(); MyService myService = retrofitUtil.createService(MyService.class); myService.goodListData(pscid,page) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<GoodsBean>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(GoodsBean goodsBean) { if (goodsBean.getCode().equals("0")){ iPresenter.getGoodsListDataFresh(goodsBean.getData()); }else { Log.d(TAG, "onNext: "+goodsBean); } } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } @Override public void getGoodsListLoadMore(String pscid, String page) { RetrofitUtil retrofitUtil = RetrofitUtil.getInstance(); MyService myService = retrofitUtil.createService(MyService.class); myService.goodListData(pscid,page) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<GoodsBean>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(GoodsBean goodsBean) { if (goodsBean.getCode().equals("0")){ iPresenter.getGoodsListDataLoadMore(goodsBean.getData()); }else { Log.d(TAG, "onNext: mmm"+goodsBean); } } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } @Override public void getGoodsDetail(DetailBean.DataBean dataBean) { } //添加购物车 @Override public void addCart(String uid, String pid,String source) { RetrofitUtil retrofitUtil = RetrofitUtil.getInstance(); MyService myService = retrofitUtil.createService(MyService.class); myService.addCart(uid,pid,source) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<AddCartBean>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(AddCartBean addCartBean) { String code = addCartBean.getCode(); Log.d(TAG, "onNext: mm"+code); if (addCartBean.getCode().equals("0")){ iPresenter.addSuccess(); }else { iPresenter.addError(); } } @Override public void onError(Throwable e) { Log.d(TAG, "onError: m错误"+e.getMessage()); } @Override public void onComplete() { } }); } @Override public void getCart(Map<String, String> map) { RetrofitUtil retrofitUtil = RetrofitUtil.getInstance(); MyService myService = retrofitUtil.createService(MyService.class); myService.getCartGood(map) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<CartGoodBean>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(CartGoodBean cartGoodBean) { String code = cartGoodBean.getCode(); Log.d(TAG, "onNext: mmmm"+code); if (code.equals("0")){ iPresenter.getCartList(cartGoodBean.getData()); } } @Override public void onError(Throwable e) { Log.d(TAG, "onError: mm"+e.getMessage()); } @Override public void onComplete() { } }); } }presenter层
public interface IPresenter { //登录 void loginPresenter(IModel iModel, IMainView iMainView); //接受参数 void getLogin(LoginBean loginBean); //接受失败的提示 void getErrorData(String string); //注册 void regPresenter(IModel iModel, IRegView iRegView); //接受注册的参数 void getReg(RegBean regBean); //接受失败的提示 void getRegError(String string); //商品列表页 void getGoodsList(IModel iModel, GoodView goodView); void getGoodsListFresh(IModel iModel,GoodView goodView); void getGoodsListLoadMore(IModel iModel,GoodView goodView); void getGoodsListData(List<GoodsBean.DataBean> list); void getGoodsListDataFresh(List<GoodsBean.DataBean> list); void getGoodsListDataLoadMore(List<GoodsBean.DataBean> list); void getGoodsListError(String error); //添加购物车 void addCart(IModel iModel, IDetailView iDetailView); void addSuccess(); void addError(); //获取购物车列表 void showCartListToView(IModel iModel, ICartView iCartView); void getCartList(List<CartGoodBean.DataBean> list); void getCartError(String string); }实现类
public class PresenterImpl implements IPresenter{ private IMainView iMainView; private IRegView iRegView; private GoodView goodView; private static final String TAG = "PresenterImpl"; private IDetailView iDetailView; private ICartView iCartView; @Override public void loginPresenter(IModel iModel, IMainView iMainView) { this.iMainView=iMainView; Map<String,String> map=new HashMap<>(); map.put("mobile",iMainView.getMobile()); map.put("password",iMainView.getPassword()); iModel.login(map); } @Override public void getLogin(LoginBean loginBean) { iMainView.loginSuccess(); } @Override public void getErrorData(String string) { iMainView.loginError(string); } @Override public void regPresenter(IModel iModel, IRegView iRegView) { this.iRegView=iRegView; Map<String,String> map=new HashMap<>(); map.put("mobile",iRegView.getMobile()); map.put("password",iRegView.getPassword()); iModel.reg(map); } @Override public void getReg(RegBean regBean) { iRegView.register(); } @Override public void getRegError(String string) { iRegView.regError(string); } //商品列表 @Override public void getGoodsList(IModel iModel, GoodView goodView) { this.goodView=goodView; iModel.getGoodsListData("1","1"); } @Override public void getGoodsListFresh(IModel iModel, GoodView goodView) { this.goodView=goodView; iModel.getGoodsListFresh("1",goodView.getPage()); } @Override public void getGoodsListLoadMore(IModel iModel, GoodView goodView) { this.goodView=goodView; iModel.getGoodsListLoadMore("1",goodView.getPage()); } @Override public void getGoodsListData(List<GoodsBean.DataBean> list) { goodView.showGoods(list); } @Override public void getGoodsListDataFresh(List<GoodsBean.DataBean> list) { goodView.showGoodsListFresh(list); } @Override public void getGoodsListDataLoadMore(List<GoodsBean.DataBean> list) { goodView.showGoodsListLoadMore(list); } @Override public void getGoodsListError(String error) { Log.d(TAG, "getGoodsListError: 错误==="+error); } @Override public void addCart(IModel iModel, IDetailView iDetailView) { this.iDetailView=iDetailView; iModel.addCart(iDetailView.getUid(),iDetailView.getPid(),iDetailView.getSource()); Log.d(TAG, "addCart: pp"+iDetailView.getPid()); } @Override public void addSuccess() { iDetailView.addSuccess(); } @Override public void addError() { iDetailView.addError(); } @Override public void showCartListToView(IModel iModel, ICartView iCartView) { this.iCartView=iCartView; } @Override public void getCartList(List<CartGoodBean.DataBean> list) { iCartView.showCartGood(list); } @Override public void getCartError(String string) { iCartView.showError(string); } }登录view
public interface IMainView { void loginSuccess(); void loginError(String error); String getMobile(); String getPassword(); } public class MainActivity extends AppCompatActivity implements IMainView,View.OnClickListener{ private EditText mobile; private EditText password; private Button login; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { mobile = findViewById(R.id.mobil); password = findViewById(R.id.pssword); login = findViewById(R.id.login); login.setOnClickListener(this); } //登录成功 @Override public void loginSuccess() { startActivity(new Intent(MainActivity.this,GoodsActivity.class)); } //登录失败 @Override public void loginError(String error) { startActivity(new Intent(MainActivity.this,RegActivity.class)); } @Override public String getMobile() { return mobile.getText().toString(); } @Override public String getPassword() { return password.getText().toString(); } @Override public void onClick(View view) { PresenterImpl presenter = new PresenterImpl(); presenter.loginPresenter(new ModelImpl(presenter),this); } }注册view
public interface IRegView { //注册 void register(); void regError(String error); String getMobile(); String getPassword(); } public class RegActivity extends AppCompatActivity implements IRegView,View.OnClickListener{ private EditText user; private EditText pwd; private Button reg; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_reg); initView(); } private void initView() { user = findViewById(R.id.user); pwd = findViewById(R.id.psw); reg = findViewById(R.id.reg); reg.setOnClickListener(this); } @Override public void register() { startActivity(new Intent(RegActivity.this,GoodsActivity.class)); } @Override public void regError(String error) { Toast.makeText(this, "--"+error, Toast.LENGTH_SHORT).show(); } @Override public String getMobile() { return user.getText().toString(); } @Override public String getPassword() { return pwd.getText().toString(); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.reg: PresenterImpl presenter = new PresenterImpl(); presenter.regPresenter(new ModelImpl(presenter),this); break; } } }列表view
public interface GoodView { //展示商品 void showGoods(List<GoodsBean.DataBean> list); //刷新 void showGoodsListFresh(List<GoodsBean.DataBean> list); //加载更多 void showGoodsListLoadMore(List<GoodsBean.DataBean> list); //获取page String getPage(); } public class GoodsActivity extends AppCompatActivity implements GoodView{ private XRecyclerView xrecycler; int page=1; private long firstTime=0; private PresenterImpl presenter; List<GoodsBean.DataBean> list=new ArrayList<>(); private MyGoodsListAdapter myGoodsListAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_goods); initView(); presenter = new PresenterImpl(); presenter.getGoodsList(new ModelImpl(presenter),this); } private void initView() { xrecycler = findViewById(R.id.xrecycler); xrecycler.setLayoutManager(new LinearLayoutManager(this)); xrecycler.setPullRefreshEnabled(true); xrecycler.setLoadingMoreEnabled(true); xrecycler.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() { page=1; presenter.getGoodsListFresh(new ModelImpl(presenter),GoodsActivity.this); Toast.makeText(GoodsActivity.this, "刷新完成", Toast.LENGTH_SHORT).show(); } @Override public void onLoadMore() { page++; presenter.getGoodsListLoadMore(new ModelImpl(presenter),GoodsActivity.this); Toast.makeText(GoodsActivity.this, "加载更多完成", Toast.LENGTH_SHORT).show(); } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { if (System.currentTimeMillis() - firstTime > 2000) { Toast.makeText(GoodsActivity.this, "再按一次退出程序--->onKeyDown", Toast.LENGTH_SHORT).show(); firstTime = System.currentTimeMillis(); } else { finish(); System.exit(0); } return true; } return super.onKeyDown(keyCode, event); } //显示商品 @Override public void showGoods(List<GoodsBean.DataBean> list) { this.list=list; myGoodsListAdapter = new MyGoodsListAdapter(GoodsActivity.this,list); xrecycler.setAdapter(myGoodsListAdapter); myGoodsListAdapter.setOnMyItemClick(new MyGoodsListAdapter.MyItemClick() { @Override public void onMyItemClick(View view, int position, int pscid) { GoodsBean.DataBean dataBean = GoodsActivity.this.list.get(position); int pid = dataBean.getPid(); Intent intent=new Intent(GoodsActivity.this,DetailActivity.class); intent.putExtra("dataBean",dataBean); startActivity(intent); } }); } @Override public void showGoodsListFresh(List<GoodsBean.DataBean> list) { this.list=list; myGoodsListAdapter=new MyGoodsListAdapter(GoodsActivity.this,list); xrecycler.setAdapter(myGoodsListAdapter); xrecycler.refreshComplete(); } @Override public void showGoodsListLoadMore(List<GoodsBean.DataBean> list) { this.list.addAll(list); myGoodsListAdapter.notifyDataSetChanged(); xrecycler.loadMoreComplete(); } @Override public String getPage() { return page+""; } }详情页面
public interface IDetailView { String getUid(); String getSource(); String getPid(); void addSuccess(); void addError(); } public class DetailActivity extends AppCompatActivity implements IDetailView,View.OnClickListener{ private static final String TAG = "DetailActivity"; private SimpleDraweeView detail_icon; private TextView detail_price; private TextView detail_title; private GoodsBean.DataBean dataBean; private PresenterImpl presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); initView(); } private void initView() { Intent intent = getIntent(); dataBean = (GoodsBean.DataBean) intent.getSerializableExtra("dataBean"); detail_icon = findViewById(R.id.detail_icon); detail_price = findViewById(R.id.detail_price); detail_title = findViewById(R.id.detail_title); TextView addcart = findViewById(R.id.detail_addcart); TextView detail_cart = findViewById(R.id.detail_Cart); String s = dataBean.getImages().split("\\|")[0]; detail_icon.setImageURI(s); detail_title.setText(dataBean.getTitle()); detail_price.setText(dataBean.getBargainPrice()+""); addcart.setOnClickListener(this); detail_cart.setOnClickListener(this); } @Override public String getUid() { return "71"; } @Override public String getSource() { return "android"; } @Override public String getPid() { Log.d(TAG, "getPid: 详情页"+dataBean.getPid()); return dataBean.getPid()+""; } @Override public void addSuccess() { Toast.makeText(this, "加入购物车成功", Toast.LENGTH_SHORT).show(); } @Override public void addError() { Toast.makeText(this, "加入购物车失败", Toast.LENGTH_SHORT).show(); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.detail_addcart: presenter = new PresenterImpl(); presenter.addCart(new ModelImpl(presenter),DetailActivity.this); break; case R.id.detail_Cart: // startActivity(new Intent(DetailActivity.this,CartActivity.class)); break; } } }recycle适配器
public class MyGoodsListAdapter extends RecyclerView.Adapter<MyGoodsListAdapter.MyViewHolder> { private Context context; private List<GoodsBean.DataBean> list; private MyItemClick myItemClick; public MyGoodsListAdapter(Context context, List<GoodsBean.DataBean> list) { this.context = context; this.list = list; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.xrecycler_item_layout, null); return new MyViewHolder(view); } @Override public void onBindViewHolder(MyViewHolder holder, final int position) { String s = list.get(position).getImages().split("\\|")[0]; holder.getSim_icon().setImageURI(s); holder.getXr_title().setText(list.get(position).getTitle()); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { myItemClick.onMyItemClick(view,position,list.get(position).getPscid()); } }); } @Override public int getItemCount() { return list.size(); } class MyViewHolder extends RecyclerView.ViewHolder{ private final TextView xr_title; private final SimpleDraweeView sim_icon; public MyViewHolder(View itemView) { super(itemView); xr_title = itemView.findViewById(R.id.xrecycler_title); sim_icon = itemView.findViewById(R.id.sim_icon); } public TextView getXr_title() { return xr_title; } public SimpleDraweeView getSim_icon() { return sim_icon; } } //自定义接口 public interface MyItemClick{ void onMyItemClick(View view,int position,int pscid); } public void setOnMyItemClick(MyItemClick myItemClick){ this.myItemClick =myItemClick; } }