课堂笔记
TicketActivity 布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@color/colorPrimary">
        <ImageView
            android:id="@+id/ticket_back"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_gravity="center_vertical"
            android:padding="11dp"
            android:src="@mipmap/back" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="@string/text_ticket_code"
            android:textColor="@color/white"
            android:textSize="16sp" />
    </RelativeLayout>
    <ImageView
        android:id="@+id/ticket_cover"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_marginTop="33dp"
        tools:src="@mipmap/ic_launcher" />
    <EditText
        android:id="@+id/ticket_code"
        android:layout_width="224dp"
        android:layout_height="40dp"
        android:layout_marginTop="33dp"
        android:background="@drawable/shape_ticket_code_edit_bg"
        android:focusable="false"
        android:gravity="center"
        android:textColor="#4A4A4A"
        android:textSize="18sp"
        tools:text="¥xhQoYC66sMX¥" />
    <TextView
        android:id="@+id/ticket_copy_or_open_btn"
        android:layout_width="141dp"
        android:layout_height="40dp"
        android:layout_marginTop="33dp"
        android:background="@drawable/shape_ticker_button_bg"
        android:gravity="center"
        android:textColor="@color/white"
        android:textSize="18sp"
        tools:text="复制淘口令" />
</LinearLayout>
注册接口和请求数据
- 之前我们把数据给 view 层时,是先注册接口,然后再把请求的网络数据给接口,这是在同一个 fragment 中,很好控制顺序。但在 TicketActivity 中只注册了接口,请求网络数据是在 HomePagerFragment 中进行的,我们不知道当数据请求成功时,接口是否已经注册好了,所以我们要对这种情况进行判断
- 在 TicketPresenterImpl 创建枚举用于表示请求网络数据的几种状态
    private LoadState mCurrentState = LoadState.NONE;
    enum LoadState {
        LOADING, SUCCESS, ERROR, NONE
    }
    @Override
    public void getTicket(String title, String url, String cover) {
        this.mCover = cover;
	// 请求发出正在加载数据
        onLoadTicketLoading();
        Retrofit retrofit = RetrofitManager.getInstance().getRetrofit();
        Api api = retrofit.create(Api.class);
        String ticketUrl = UrlUtils.getTicketUrl(url);
        TicketParams ticketParams = new TicketParams(ticketUrl, title);
        Call<TicketModel> task = api.getTicket(ticketParams);
        task.enqueue(new Callback<TicketModel>() {
            @Override
            public void onResponse(Call<TicketModel> call, Response<TicketModel> response) {
                int code = response.code();
                if (code == HttpURLConnection.HTTP_OK) {
                    mTicketResult = response.body();
		    // 请求成功
                    onTicketLoaded();
                } else {
		    // 请求失败
                    onLoadTicketError();
                }
            }
            @Override
            public void onFailure(Call<TicketModel> call, Throwable t) {
		// 请求失败
                onLoadTicketError();
            }
        });
    }
private void onLoadTicketLoading() {
        if (mCallback != null) {
            mCallback.onLoading();
        } else {
            mCurrentState = LoadState.LOADING;
        }
    }
    private void onLoadTicketError() {
        if (mCallback != null) {
            mCallback.onError();
        } else {
            mCurrentState = LoadState.ERROR;
        }
    }
    private void onTicketLoaded() {
        if (mCallback != null) {
            mCallback.onTicketCodeLoaded(mCover, mTicketResult);
        } else {
            mCurrentState = LoadState.SUCCESS;
        }
    }
- 如果接口已经注册,那就正常加载三种状态界面,如果接口还没注册,那就做一个标记,标记 网络请求的结果状态,等接口注册时,根据不同的 网络请求的结果状态 ,加载不同的方法
    @Override
    public void registerViewCallback(ITicketCallBack callback) {
        mCallback = callback;
        if (mCurrentState != LoadState.NONE) {
            if (mCurrentState == LoadState.SUCCESS) {
                onTicketLoaded();
            } else if (mCurrentState == LoadState.ERROR) {
                onLoadTicketError();
            } else if (mCurrentState == LoadState.LOADING) {
                onLoadTicketLoading();
            }
        }
    }
显示淘口令和商品图片
- TicketActivity 通过接口拿到数据后,先绑定相关控件
    @BindView(R.id.ticket_cover)
    public ImageView mCover;
    @BindView(R.id.ticket_code)
    public EditText mCode;
    @BindView(R.id.ticket_copy_or_open_btn)
    public TextView mTvCopyOrOpen;
- 加载数据时,图片的 url 要加前缀 “https:”,还有判空
    @Override
    public void onTicketCodeLoaded(String cover, TicketModel ticketModel) {
        if (mCover != null && !TextUtils.isEmpty(cover)) {
            Glide.with(this).load(UrlUtils.getCoverPath(cover)).into(mCover);
        }
        if (ticketModel != null && ticketModel.getData().getTbk_tpwd_create_response() != null) {
            String code = ticketModel.getData().getTbk_tpwd_create_response().getData().getModel();
            mCode.setText(code);
        }
    }