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 的類裏實現序列化

如圖:子類裏也實現序列化 ,因爲會用到

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章