课堂笔记
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);
}
}