android MVP登录+注册+xrecyclerview+商品详情+加入购物车

一、导入依赖

    //Butterknifejia依赖
    compile 'com.jakewharton:butterknife:8.4.0'
     //使用Butterknife调用插件:
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
    //    Rxjava依赖
    compile 'io.reactivex:rxjava:1.0.14'
    compile 'io.reactivex:rxandroid:1.0.1'
    //    Retrofit的依赖
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
    //    Fresco的依赖
    compile 'com.facebook.fresco:fresco:1.3.0'
    //    XRecyclerView 依赖:
    compile 'com.jcodecraeer:xrecyclerview:1.3.2'

    //Butterknife的classpath   (写在project下的build.gradle)
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'


二、添加权限


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

接下来正式开始写代码:

1、首先:httpConfig –>要用到的接口路径


package com.bwei.lenovo.day0404_yuekao2.http;


public class HttpConfig {

    public static String base_url="http://120.27.23.105/";
}

2、RetrofitUtils 请求网络的工具类

package com.bwei.lenovo.day0404_yuekao2.http;

import com.google.gson.Gson;

import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitUtils {

    private static RetrofitUtils retrofitUtils=null;
    private final Retrofit retrofit;

    public static RetrofitUtils getInstance(){
        if (retrofitUtils==null){
            retrofitUtils = new RetrofitUtils();
        }
        return retrofitUtils;
    }

    public RetrofitUtils() {
        retrofit = new Retrofit.Builder()
                .baseUrl(HttpConfig.base_url)
                .addConverterFactory(GsonConverterFactory.create(new Gson()))
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
    }

    public <T> T createRequest(Class<T> clz){
        T t = retrofit.create(clz);
        return t;
    }
}

一、代码里用到的所有布局

<1>登录页面的布局

<?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.bwei.lenovo.day0404_yuekao2.MainActivity">

    <TextView
        android:textColor="#f00"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center_horizontal"
        android:text="淘宝登录"
        android:textSize="30dp" />

    <View
        android:layout_width="match_parent"
        android:layout_height="2sp"
        android:background="#f00" />

    <EditText
        android:layout_marginTop="20dp"
        android:id="@+id/moblie"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="手机号/会员号/邮箱" />

    <EditText
        android:layout_marginTop="10dp"
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入密码" />

    <Button
        android:layout_marginTop="10dp"
        android:layout_gravity="center_horizontal"
        android:id="@+id/login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="登录"/>
</LinearLayout>


<2>注册页面的布局


<?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.bwei.lenovo.day0404_yuekao2.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center_horizontal"
        android:text="淘宝注册页面"
        android:textColor="#f00"
        android:textSize="30dp" />

    <View
        android:layout_width="match_parent"
        android:layout_height="2sp"
        android:background="#f00" />

    <EditText
        android:id="@+id/moblie"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="35dp"
        android:hint="请输入用户名" />

    <EditText
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:hint="请输入密码" />

    <EditText
        android:id="@+id/password_true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:hint="确认输入密码" />

    <EditText
        android:id="@+id/email"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:hint="请填写邮箱" />

    <Button
        android:id="@+id/register"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="20dp"
        android:text="注册" />
</LinearLayout>


<3>Xrecylerview展示商品列表的布局

<?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.bwei.lenovo.day0404_yuekao2.Acitivity.GoodsActivity">

    <com.jcodecraeer.xrecyclerview.XRecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/xrecylerview"></com.jcodecraeer.xrecyclerview.XRecyclerView>

</LinearLayout>

<4>Xrecylerview商品展示的item布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:layout_height="match_parent">

    <com.facebook.drawee.view.SimpleDraweeView
        android:layout_marginLeft="10dp"
        android:layout_width="120dp"
        android:id="@+id/goods_img"
        android:layout_marginRight="20dp"
        android:layout_height="120dp" />

    <TextView
        android:text="价格"
        android:textSize="20dp"
        android:id="@+id/goods_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</LinearLayout>

<5>商品详情的布局

<?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.bwei.lenovo.day0404_yuekao2.Acitivity.DetaileActivity">

    <LinearLayout
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

    <com.facebook.drawee.view.SimpleDraweeView
        android:layout_marginTop="40dp"
        android:id="@+id/detaile_img"
        android:layout_width="match_parent"
        android:scaleType="fitXY"
        android:layout_height="500dp"
        android:layout_gravity="center_horizontal" />

    <TextView
        android:textSize="25sp"
        android:layout_marginTop="10dp"
        android:id="@+id/detaile_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="标题" />

    <TextView
        android:textColor="#f00"
        android:layout_marginTop="10dp"
        android:text="价格"
        android:id="@+id/detaile_price"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <LinearLayout
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
        <LinearLayout
            android:layout_weight="1"
            android:layout_marginLeft="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <ImageView

                android:layout_width="30dp"
                android:layout_height="30dp"
                android:src="@drawable/order_msg" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="客服" />

        </LinearLayout>

        <LinearLayout
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <ImageView

                android:layout_width="30dp"
                android:layout_height="30dp"
                android:src="@drawable/dianpu" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="店家" />

        </LinearLayout>

        <LinearLayout
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <ImageView
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:src="@drawable/normalheart" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="收藏" />

        </LinearLayout>

        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_weight="2">
        <Button
            android:layout_weight="1"
            android:id="@+id/detail_addCart"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#FEC401"
            android:text="加入购物车"
            android:textColor="#FFFFFF" />

        <Button
            android:layout_weight="1"
            android:id="@+id/detail_goodsCart"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#FF6A04"
            android:text="立即购买"
            android:textColor="#FFFFFF" />
    </LinearLayout>
</LinearLayout>
</LinearLayout>

二、view层

<1>view的 ( ILoginView ) 登录 的接口

package com.bwei.lenovo.day0404_yuekao2.view;

public interface ILoginView {
    //登录成功
    void loginSuccess();
   //登录失败
    void loginError(String error);
    //获取用户名
    String getMobile();
    //获取密码
    String getPassword();
}

<2>view的 (IRegView)注册的接口

package com.bwei.lenovo.day0404_yuekao2.view;

public interface IRegView {
    //注册
    void register();
    //注册成功
    void regSucces(String error);
    //获取用户名
    String getMobile();
    //获取密码
    String getPassword();
}

<3>view的 ( IGoodsView) 展示xrecyclerview的接口

package com.bwei.lenovo.day0404_yuekao2.view;

import com.bwei.lenovo.day0404_yuekao2.bean.GoodsBean;
import java.util.List;


public interface IGoodsView {
    //展示商品
    void getGoodsList(List<GoodsBean.DataBean> list);

    //刷新
    void getshowRefresh(List<GoodsBean.DataBean> list);
    //加载
    void getshowLoadMore(List<GoodsBean.DataBean> list);
    //获取page
    String getpage();
}

<4>view的 (IAddCartView) 添加购物车的接口

package com.bwei.lenovo.day0404_yuekao2.view;

public interface IAddCartView {

    //获取uid  展示详情页面
    String getuid();
    //获取pid
    String getpid();

    //添加成功的方法
    void addSuccess();
    // 添加失败的方法
    void addError();


}



三、model层 获取数据

<1>MyService接口

package com.bwei.lenovo.day0404_yuekao2.model;

import com.bwei.lenovo.day0404_yuekao2.bean.AddBean;
import com.bwei.lenovo.day0404_yuekao2.bean.GoodsBean;
import com.bwei.lenovo.day0404_yuekao2.bean.ResBean;
import com.bwei.lenovo.day0404_yuekao2.bean.UserBean;

import java.util.Map;

import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.QueryMap;
import rx.Observable;

public interface MyService {
    //登录
    @FormUrlEncoded
    @POST("user/login")
    Observable<UserBean> getloginData(@FieldMap Map<String, String> map);

    //注册
    @FormUrlEncoded
    @POST("user/reg")
    Observable<ResBean> getRegister(@FieldMap Map<String, String> map);

    //展示商品列表
    @FormUrlEncoded
    @POST("product/getProducts")
    Observable<GoodsBean> getGoodsList(@FieldMap Map<String, String> map);


    //添加购物车
    @GET("product/addCart")
    Observable<AddBean> AddGoodsCart(@QueryMap Map<String, String> map);
}

<2> model层 (IModel)接口

package com.bwei.lenovo.day0404_yuekao2.model;

import java.util.Map;

public interface IModel {
    //登录
    void login(Map<String, String> map);

    //注册
    void register(Map<String, String> map);

    //商品列表
    void getGoodsList(Map<String, String> map);

    //刷新
    void getGoodsRefresh(Map<String, String> map);

    //加载
    void getGoodsLoadMore(Map<String, String> map);

    //加入购物车
    void getAddGoodsCart(Map<String,String> map);
}

<3>model层 (IModelmpI) IModel的实现类

package com.bwei.lenovo.day0404_yuekao2.model;

import android.util.Log;

import com.bwei.lenovo.day0404_yuekao2.bean.AddBean;
import com.bwei.lenovo.day0404_yuekao2.bean.GoodsBean;
import com.bwei.lenovo.day0404_yuekao2.bean.ResBean;
import com.bwei.lenovo.day0404_yuekao2.http.RetrofitUtils;
import com.bwei.lenovo.day0404_yuekao2.presenter.IPresenter;
import com.bwei.lenovo.day0404_yuekao2.bean.UserBean;

import java.util.Map;

import rx.Observable;
import rx.Observer;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

public class IModelmpI implements IModel {
    private static final String TAG = "IModelmpI";
    IPresenter iPresenter;

    public IModelmpI(IPresenter iPresenter) {
        this.iPresenter = iPresenter;
    }

    //登录
    @Override
    public void login(Map<String, String> map) {
        RetrofitUtils instance = RetrofitUtils.getInstance();
        MyService myService = instance.createRequest(MyService.class);
        Observable<UserBean> userBeanObservable = myService.getloginData(map);
        userBeanObservable.subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<UserBean>() {
                    @Override
                    public void onCompleted() {
                        Log.d("IModelmpI", "onCompleted()-登录完成----------");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d("IModelmpI", "onError()-登录出现异常----------" + e.getMessage());
                    }

                    @Override
                    public void onNext(UserBean userBean) {
                        Log.d("IModelmpI", "onNext()-登录正在执行----------" + userBean);
                        if (userBean.getCode().equals("0")) {
                            iPresenter.getLogin(userBean);
                        } else {
                            iPresenter.getErrorData("请先注册吧!");
                        }
                    }
                });
    }

    //注册
    @Override
    public void register(Map<String, String> map) {
        RetrofitUtils instance = RetrofitUtils.getInstance();
        MyService myService = instance.createRequest(MyService.class);
        Observable<ResBean> register = myService.getRegister(map);
        register.observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.newThread())
                .subscribe(new Observer<ResBean>() {
                    @Override
                    public void onCompleted() {
                        Log.d("IModelmpI", "onCompleted()-注册完成--------------");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d("IModelmpI", "onError()-注册异常-------------" + e.getMessage());
                    }

                    @Override
                    public void onNext(ResBean resBean) {
                        Log.d("IModelmpI", "onNext()-注册正在执行-------------" + resBean);
                        if (resBean.getCode().equals("0")) {
                            iPresenter.getRegister(resBean);
                        }
                    }
                });

    }

    //展示商品列表
    @Override
    public void getGoodsList(Map<String, String> map) {
        RetrofitUtils instance = RetrofitUtils.getInstance();
        MyService myService = instance.createRequest(MyService.class);
        Observable<GoodsBean> observable = myService.getGoodsList(map);
        observable.subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<GoodsBean>() {
                    @Override
                    public void onCompleted() {
                        Log.d("IModelmpI", "onCompleted()-获取商品展示完成----------------");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d("IModelmpI", "onError()-获取商品展示异常----------------" + e.getMessage());
                    }

                    @Override
                    public void onNext(GoodsBean goodsBean) {
                        Log.d("IModelmpI", "onNext()-获取商品展示-正在执行-------------" + goodsBean);
                        if (goodsBean.getCode().equals("0")) {
                            iPresenter.getGoodsLists(goodsBean.getData());
                        }
                    }
                });
    }

    //刷新列表
    @Override
    public void getGoodsRefresh(Map<String, String> map) {
        RetrofitUtils instance = RetrofitUtils.getInstance();
        MyService myService = instance.createRequest(MyService.class);
        Observable<GoodsBean> observable = myService.getGoodsList(map);
        observable.subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<GoodsBean>() {
                    @Override
                    public void onCompleted() {
                        Log.d("IModelmpI", "onCompleted()-刷新完成----------------");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d("IModelmpI", "onError()-刷新异常-----------" + e.getMessage());
                    }

                    @Override
                    public void onNext(GoodsBean goodsBean) {
                        Log.d("IModelmpI", "onNext()-刷新正在执行-----------" + goodsBean);
                        if (goodsBean.getCode().equals("0")) {
                            iPresenter.getGoodsRefreshLists(goodsBean.getData());
                        }
                    }
                });
    }

    //加载列表
    @Override
    public void getGoodsLoadMore(Map<String, String> map) {
        RetrofitUtils instance = RetrofitUtils.getInstance();
        MyService myService = instance.createRequest(MyService.class);
        Observable<GoodsBean> goodsList = myService.getGoodsList(map);
        goodsList.observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.newThread())
                .subscribe(new Observer<GoodsBean>() {
                    @Override
                    public void onCompleted() {
                        Log.d("IModelmpI", "onCompleted()-加载完成----------");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d("IModelmpI", "onError()-加载异常-------" + e.getMessage());
                    }

                    @Override
                    public void onNext(GoodsBean goodsBean) {
                        Log.d("IModelmpI", "onNext()-加载正在执行----------------" + goodsBean);
                        Log.e(TAG, "onNext: ," + goodsBean.getCode());
                        if (goodsBean.getCode().equals("0")) {
                            iPresenter.getGoodsLoadMoreLists(goodsBean.getData());
                        }
                    }
                });
    }

    //添加购物车
    @Override
    public void getAddGoodsCart(Map<String, String> map) {
        RetrofitUtils instance = RetrofitUtils.getInstance();
        MyService myService = instance.createRequest(MyService.class);
        Observable<AddBean> observable = myService.AddGoodsCart(map);
        observable.subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<AddBean>() {
                    @Override
                    public void onCompleted() {
                        Log.d("IModelmpI", "onCompleted()-添加购物车加载完成-----------");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d("IModelmpI", "onError()-添加购物车出现异常---------" + e.getMessage());
                        iPresenter.addError();
                    }

                    @Override
                    public void onNext(AddBean addBean) {
                        Log.d("IModelmpI", "onNext()-添加购物车正在执行--------" + addBean);
                        String code = addBean.getCode();
                        Log.d(TAG, "--获取code-------------"+code);
                        if (code.equals("0")) {
                            iPresenter.addSuccess();
                        } else {
                            iPresenter.addError();
                        }
                    }
                });
    }


}

三、p层做逻辑操作

<1>p层的 (IPresentr) 接口

package com.bwei.lenovo.day0404_yuekao2.presenter;

import com.bwei.lenovo.day0404_yuekao2.bean.GoodsBean;
import com.bwei.lenovo.day0404_yuekao2.bean.ResBean;
import com.bwei.lenovo.day0404_yuekao2.model.IModel;
import com.bwei.lenovo.day0404_yuekao2.view.IAddCartView;
import com.bwei.lenovo.day0404_yuekao2.view.IGoodsView;
import com.bwei.lenovo.day0404_yuekao2.view.ILoginView;
import com.bwei.lenovo.day0404_yuekao2.view.IRegView;
import com.bwei.lenovo.day0404_yuekao2.bean.UserBean;

import java.util.List;

public interface IPresenter {

    //登录
    void getLoginPresenter(IModel iModel, ILoginView iLoginView);

    void getLogin(UserBean userBean);

    //接受失败的提示
    void getErrorData(String string);

    //注册
    void getRegisterPresenter(IModel iModel, IRegView iRegView);

    void getRegister(ResBean resBean);

    //接受失败的提示
    void getRegisterErrorData(String string);

    //展示列表
    void getGoodsView(IModel iModel, IGoodsView iGoodsView);

    void getGoodsLists(List<GoodsBean.DataBean> list);
    //刷新
    void getGoodsRefreshView(IModel iModel, IGoodsView iGoodsView);

    void getGoodsRefreshLists(List<GoodsBean.DataBean> list);

    //加载
    void getGoodsLoadMoreView(IModel iModel, IGoodsView iGoodsView);

    void getGoodsLoadMoreLists(List<GoodsBean.DataBean> list);

    //添加购物车
    void getaddCart(IModel iModel, IAddCartView iAddCartView);

    void addSuccess();

    void addError();


}

<2>P层 ( IPresenterImpI) IPresentr 接口的实现类

package com.bwei.lenovo.day0404_yuekao2.presenter;

import android.util.Log;

import com.bwei.lenovo.day0404_yuekao2.bean.GoodsBean;
import com.bwei.lenovo.day0404_yuekao2.bean.ResBean;
import com.bwei.lenovo.day0404_yuekao2.model.IModel;
import com.bwei.lenovo.day0404_yuekao2.view.IAddCartView;
import com.bwei.lenovo.day0404_yuekao2.view.IGoodsView;
import com.bwei.lenovo.day0404_yuekao2.view.ILoginView;
import com.bwei.lenovo.day0404_yuekao2.view.IRegView;
import com.bwei.lenovo.day0404_yuekao2.bean.UserBean;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class IPresenterImpI implements IPresenter {
    private ILoginView iLoginView;
    private IRegView iRegView;
    private IGoodsView iGoodsView;
    private static final String TAG = "IPresenterImpI";
    private IAddCartView iAddCartView;

    //登录
    @Override
    public void getLoginPresenter(IModel iModel, ILoginView iLoginView) {
        this.iLoginView = iLoginView;
        Map<String, String> map = new HashMap<>();
        map.put("mobile", iLoginView.getMobile());
        map.put("password", iLoginView.getPassword());
        iModel.login(map);

    }

    @Override
    public void getLogin(UserBean userBean) {
        Log.d("IPresenterImpI", "--P层获取到数据-------------" + userBean);
        iLoginView.loginSuccess();
    }

    @Override
    public void getErrorData(String string) {
        Log.d("IPresenterImpI", "--P层出现异常-------------" + string);
        iLoginView.loginError(string);
    }

    //注册
    @Override
    public void getRegisterPresenter(IModel iModel, IRegView iRegView) {
        this.iRegView = iRegView;
        Map<String, String> map = new HashMap<>();
        map.put("mobile", iRegView.getMobile());
        map.put("password", iRegView.getPassword());
        iModel.register(map);
    }

    @Override
    public void getRegister(ResBean resBean) {
        Log.d("IPresenterImpI", "p层获取到数据------------" + resBean);
        iRegView.register();
    }

    @Override
    public void getRegisterErrorData(String string) {
        iRegView.regSucces(string);
    }

    //展示数据
    @Override
    public void getGoodsView(IModel iModel, IGoodsView iGoodsView) {
        this.iGoodsView = iGoodsView;
        Map<String, String> map = new HashMap<>();
        map.put("pscid", "1");
        map.put("page", "1");
        iModel.getGoodsList(map);
    }

    @Override
    public void getGoodsLists(List<GoodsBean.DataBean> list) {
        Log.d("IPresenterImpI", "p层展示--获取到数据----" + list);
        iGoodsView.getGoodsList(list);
    }

    //刷新
    @Override
    public void getGoodsRefreshView(IModel iModel, IGoodsView iGoodsView) {
        this.iGoodsView = iGoodsView;
        Map<String, String> map = new HashMap<>();
//        map.put("2", iGoodsView.getpage());
        map.put("page", iGoodsView.getpage());
        map.put("pscid", "1");
        iModel.getGoodsRefresh(map);
    }

    @Override
    public void getGoodsRefreshLists(List<GoodsBean.DataBean> list) {
        Log.d("IPresenterImpI", "p层获取到刷新的数据-------" + list);
        iGoodsView.getshowRefresh(list);
    }

    //加载
    @Override
    public void getGoodsLoadMoreView(IModel iModel, IGoodsView iGoodsView) {
        this.iGoodsView = iGoodsView;
        Map<String, String> map = new HashMap<>();
//        map.put("2", iGoodsView.getpage());
        map.put("page", iGoodsView.getpage());
        map.put("pscid", "1");
        iModel.getGoodsLoadMore(map);
    }

    @Override
    public void getGoodsLoadMoreLists(List<GoodsBean.DataBean> list) {
        Log.d("IPresenterImpI", "p层获取到加载的数据--------" + list);
        iGoodsView.getshowLoadMore(list);
    }

    //添加购物车
    @Override
    public void getaddCart(IModel iModel, IAddCartView iAddCartView) {
        this.iAddCartView = iAddCartView;
        Map<String, String> map = new HashMap<>();
        map.put("uid", iAddCartView.getuid());
        map.put("pid", iAddCartView.getpid());
        map.put("source","android");
        iModel.getAddGoodsCart(map);
    }
    //添加成功的方法
    @Override
    public void addSuccess() {
        iAddCartView.addSuccess();
    }
    //添加失败的方法
    @Override
    public void addError() {
        iAddCartView.addError();
    }
}

五、Activity界面

<1>登录页面的Activity (MainActivity ) 主页面登录跳转

package com.bwei.lenovo.day0404_yuekao2;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.bwei.lenovo.day0404_yuekao2.Acitivity.GoodsActivity;
import com.bwei.lenovo.day0404_yuekao2.Acitivity.ResActivity;
import com.bwei.lenovo.day0404_yuekao2.model.IModelmpI;
import com.bwei.lenovo.day0404_yuekao2.presenter.IPresenter;
import com.bwei.lenovo.day0404_yuekao2.presenter.IPresenterImpI;
import com.bwei.lenovo.day0404_yuekao2.view.ILoginView;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;


public class MainActivity extends AppCompatActivity implements ILoginView {

    @BindView(R.id.moblie)
    EditText moblie;
    @BindView(R.id.password)
    EditText password;
    @BindView(R.id.login)
    Button login;

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

    }

    //登录的点击事件
    @OnClick(R.id.login)
    public void onViewClicked() {
        IPresenterImpI iPresenterImpI = new IPresenterImpI();
        iPresenterImpI.getLoginPresenter(new IModelmpI(iPresenterImpI),this);
    }

    //------------------------重写LoginView方法----------------
    //成功
    @Override
    public void loginSuccess() {
        //登录成功时跳转到展示商品列表的页面
        Intent intent = new Intent(MainActivity.this, GoodsActivity.class);
        startActivity(intent);
    }

    //失败
    @Override
    public void loginError(String error) {

        Toast.makeText(this, "登录失败,准备跳往注册页面", Toast.LENGTH_SHORT).show();
        //跳往注册页面
        Intent intent = new Intent(MainActivity.this, ResActivity.class);
        startActivity(intent);
    }

    //获取用户名
    @Override
    public String getMobile() {
        return moblie.getText().toString();
    }

    //获取密码
    @Override
    public String getPassword() {
        return password.getText().toString();
    }
}

<2>注册的Activity (ResActivity )

package com.bwei.lenovo.day0404_yuekao2.Acitivity;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.bwei.lenovo.day0404_yuekao2.MainActivity;
import com.bwei.lenovo.day0404_yuekao2.R;
import com.bwei.lenovo.day0404_yuekao2.model.IModelmpI;
import com.bwei.lenovo.day0404_yuekao2.presenter.IPresenterImpI;
import com.bwei.lenovo.day0404_yuekao2.view.IRegView;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class ResActivity extends AppCompatActivity implements IRegView{

    @BindView(R.id.moblie)
    EditText moblie;
    @BindView(R.id.password)
    EditText password;
    @BindView(R.id.password_true)
    EditText passwordTrue;
    @BindView(R.id.email)
    EditText email;
    @BindView(R.id.register)
    Button register;

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


    }
     //注册的点击事件
    @OnClick(R.id.register)
    public void onViewClicked() {

        IPresenterImpI iPresenterImpI=new IPresenterImpI();
        iPresenterImpI.getRegisterPresenter(new IModelmpI(iPresenterImpI),this);
    }
//-------------  注册的点击事件-----------------------
    @Override
    public void register() {
        Intent intent = new Intent(ResActivity.this, GoodsActivity.class);
        startActivity(intent);
    }

    @Override
    public void regSucces(String error) {
        Toast.makeText(this, "注册失败---", Toast.LENGTH_SHORT).show();
    }

    @Override
    public String getMobile() {
        return moblie.getText().toString();
    }

    @Override
    public String getPassword() {
        return password.getText().toString();
    }

}

<3>商品列表的Activity (GoodsActivity)

package com.bwei.lenovo.day0404_yuekao2.Acitivity;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Parcelable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Toast;

import com.bwei.lenovo.day0404_yuekao2.R;
import com.bwei.lenovo.day0404_yuekao2.adpter.MyGoodsAdapter;
import com.bwei.lenovo.day0404_yuekao2.bean.GoodsBean;
import com.bwei.lenovo.day0404_yuekao2.model.IModelmpI;
import com.bwei.lenovo.day0404_yuekao2.presenter.IPresenterImpI;
import com.bwei.lenovo.day0404_yuekao2.view.IGoodsView;
import com.jcodecraeer.xrecyclerview.XRecyclerView;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

import static android.os.Build.VERSION_CODES.M;

public class GoodsActivity extends AppCompatActivity implements IGoodsView {
    private static final String TAG = "GoodsActivity";
    @BindView(R.id.xrecylerview)
    XRecyclerView xrecylerview;
    private long firstTime = 0;
    int page = 1;
    private IPresenterImpI iPresenterImpI;
    List<GoodsBean.DataBean> list = new ArrayList<>();
    private MyGoodsAdapter myGoodsAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_goods);
        ButterKnife.bind(this);
        //初始化数据
        initviews();

        iPresenterImpI = new IPresenterImpI();
        iPresenterImpI.getGoodsView(new IModelmpI(iPresenterImpI), this);

    }

    private void initviews() {
        //刷新
        xrecylerview.setLayoutManager(new LinearLayoutManager(this));
        xrecylerview.setLoadingMoreEnabled(true);
        xrecylerview.setPullRefreshEnabled(true);
        xrecylerview.setLoadingListener(new XRecyclerView.LoadingListener() {
            @Override
            public void onRefresh() {
                page = 1;

                iPresenterImpI.getGoodsRefreshView(new IModelmpI(iPresenterImpI), GoodsActivity.this);
                Log.d(TAG, "onRefresh: -----+刷新====");
                xrecylerview.refreshComplete();
            }

            @Override
            public void onLoadMore() {
                Log.d(TAG, "onLoadMore: 加载=====");

                //加载时进行延时一秒的操作
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        page++;
                        iPresenterImpI.getGoodsLoadMoreView(new IModelmpI(iPresenterImpI), GoodsActivity.this);
                        xrecylerview.loadMoreComplete();
                    }
                }, 1000);


            }
        });
    }

    //---------------------------------重写IGoodsview---方法-------------------------------------------------------
    //展示商品列表
    @Override
    public void getGoodsList(final List<GoodsBean.DataBean> list) {
        this.list = list;
        Log.d("GoodsActivity", "-展示列表activity--获取到集合--------" + list);
        myGoodsAdapter = new MyGoodsAdapter(this, list);
        xrecylerview.setAdapter(myGoodsAdapter);
        //展示列表的点击事件---》跳转到详情页---》  这里要注意在bean类里面加上Serializable
        myGoodsAdapter.setOnMyitemClick(new MyGoodsAdapter.MyItemClickLinstener() {
            @Override
            public void onMyItemClick(View view, int poistion, int pscid) {
                GoodsBean.DataBean dataBean = GoodsActivity.this.list.get(poistion);
                Intent intent = new Intent(GoodsActivity.this, DetaileActivity.class);
                intent.putExtra("goodsbean", dataBean);
                startActivity(intent);
            }
        });
    }

    //刷新
    @Override
    public void getshowRefresh(List<GoodsBean.DataBean> list) {
        this.list = list;
        Log.d("GoodsActivity", "显示刷新----" + list);
        //  xrecylerview.setAdapter(myGoodsAdapter);
        myGoodsAdapter.setList(list);
        myGoodsAdapter.notifyDataSetChanged();


    }

    //加载
    @Override
    public void getshowLoadMore(List<GoodsBean.DataBean> list) {

        myGoodsAdapter.getList().addAll(list);
        //刷新适配器
        myGoodsAdapter.notifyDataSetChanged();
        Log.d("GoodsActivity", "显示加载----" + list.toString());

    }

    //    获取page
    @Override
    public String getpage() {
        return page + "";
    }

    //点击按钮退出程序提示
    @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, "再按一次退出程序--->确定么", Toast.LENGTH_SHORT).show();
                firstTime = System.currentTimeMillis();
            } else {
                finish();
                System.exit(0);
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

}

<4>商品详情页的Activity (DetaileActivity)

package com.bwei.lenovo.day0404_yuekao2.Acitivity;

import android.content.Intent;
import android.graphics.Paint;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.bwei.lenovo.day0404_yuekao2.R;
import com.bwei.lenovo.day0404_yuekao2.bean.GoodsBean;
import com.bwei.lenovo.day0404_yuekao2.model.IModelmpI;
import com.bwei.lenovo.day0404_yuekao2.presenter.IPresenterImpI;
import com.bwei.lenovo.day0404_yuekao2.view.IAddCartView;
import com.facebook.drawee.view.SimpleDraweeView;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class DetaileActivity extends AppCompatActivity implements IAddCartView {

    @BindView(R.id.detail_addCart)
    Button detailAddCart;
    @BindView(R.id.detail_goodsCart)
    Button detailGoodsCart;
    @BindView(R.id.detaile_img)
    SimpleDraweeView detaileImg;
    @BindView(R.id.detaile_title)
    TextView detaileTitle;
    @BindView(R.id.detaile_price)
    TextView detailePrice;
    private GoodsBean.DataBean dataBean;
    private IPresenterImpI iPresenterImpI;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detaile);
        ButterKnife.bind(this);
        //获取商品列表传过来的数据
        getDatas();
    }

    //点击事件
    @OnClick({R.id.detail_addCart, R.id.detail_goodsCart})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.detail_addCart:
                //调用平层加载添加购物车数据
                iPresenterImpI = new IPresenterImpI();
                iPresenterImpI.getaddCart(new IModelmpI(iPresenterImpI),this);
                break;

            case R.id.detail_goodsCart:
                //跳转购物车列表页面
                Intent intent = new Intent(DetaileActivity.this,GoodsCartActivity.class);
                startActivity(intent);
                break;
        }
    }
//=------------------重写IAddView的方法----------------

    //根据传过来的对象  -->获取详情页面的数据
    public void getDatas() {
        Intent intent = getIntent();
        dataBean = (GoodsBean.DataBean) intent.getSerializableExtra("goodsbean");
        String  s = dataBean.getImages().split("\\|")[0];
        //图片
        detaileImg.setImageURI(s);
        //标题
        detaileTitle.setText(dataBean.getTitle());
        //价格
        detailePrice.setText(dataBean.getBargainPrice()+"");
        //给价格 添加删除线
        detailePrice.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
    }
    //获取uid的方法
    @Override
    public String getuid() {
        return "71";
    }
    //获取pid的方法
    @Override
    public String 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();
    }

}

六、Frsco展示图片需要初始化,不要忘记去清单文件配置哦!这里就不写啦!

package com.bwei.lenovo.day0404_yuekao2.application;

import android.app.Application;

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

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

七、接下来是适配器 adpter (MyGoodsAdapter )

package com.bwei.lenovo.day0404_yuekao2.adpter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.bwei.lenovo.day0404_yuekao2.R;
import com.bwei.lenovo.day0404_yuekao2.bean.GoodsBean;
import com.facebook.drawee.view.SimpleDraweeView;

import java.util.List;

public class MyGoodsAdapter extends RecyclerView.Adapter<MyGoodsAdapter.MyViewHolder> {
    Context context;
    List<GoodsBean.DataBean> list;
    private MyItemClickLinstener myItemClickLinstener;

    public MyGoodsAdapter(Context context, List<GoodsBean.DataBean> list) {
        this.context = context;
        this.list = list;
    }

    public List<GoodsBean.DataBean> getList() {
        return list;
    }

    public void setList(List<GoodsBean.DataBean> list) {
        this.list = list;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View inflate = View.inflate(context, R.layout.layout_goods_item, null);
        MyViewHolder myViewHolder = new MyViewHolder(inflate);
        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
        String image_url = list.get(position).getImages().split("\\|")[0];
        holder.getGoods_img().setImageURI(image_url);
        holder.getGoods_text().setText(list.get(position).getTitle());

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                myItemClickLinstener.onMyItemClick(view,position,list.get(position).getPscid());
            }
        });
    }

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

    class MyViewHolder extends RecyclerView.ViewHolder {

        private final SimpleDraweeView goods_img;
        private final TextView goods_text;

        public MyViewHolder(View itemView) {
            super(itemView);
            goods_img = itemView.findViewById(R.id.goods_img);
            goods_text = itemView.findViewById(R.id.goods_text);
        }

        public MyViewHolder(View itemView, SimpleDraweeView goods_img, TextView goods_text) {
            super(itemView);
            this.goods_img = goods_img;
            this.goods_text = goods_text;
        }

        public SimpleDraweeView getGoods_img() {
            return goods_img;
        }

        public TextView getGoods_text() {
            return goods_text;
        }


    }

    //定义自己的item事件
    public interface MyItemClickLinstener {
        void onMyItemClick(View view,int poistion,int pscid);
    }

    public void setOnMyitemClick(MyItemClickLinstener myItemClickLinstener) {
        this.myItemClickLinstener = myItemClickLinstener;
    }
}

上面的代码大概就写完功能了,当然里面要注意的是:一定会用到bean类,大家记得添加,这里就不写啦!

当然不要忘记 登录和注册 要封装一个bean类,如下:

package com.bwei.lenovo.day0404_yuekao2.bean;

public class LoginBean {
   //用户名
    private String mobile;
    //密码
    private String password;

    public LoginBean(String mobile, String password) {
        this.mobile = mobile;
        this.password = password;
    }

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "LoginBean{" +
                "mobile='" + mobile + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

还有:最重要的是给GoodsBean添加序列化,好供商品详情页展示数据 如下: 不要忘记噢!

如图所示一定要在 goodsBean 的类里实现序列化

如图:子类里也实现序列化 ,因为会用到

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值