课堂笔记
跳转到淘口令界面
- 创建 TicketActivity 和 BaseActivity ,让 BaseActivity 继承 AppCompatActivity ,TicketActivity 和 MainActivity 继承 BaseActivity
- 把一些公用的方法写在 BaseActivity ,子类用时可以重写
public abstract class BaseActivity extends AppCompatActivity {
private Unbinder mBind;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutResourceId());
mBind = ButterKnife.bind(this);
intiView();
initEvent();
}
protected void initEvent() {
}
protected abstract void intiView();
@Override
protected void onDestroy() {
super.onDestroy();
if (mBind != null) {
mBind.unbind();
}
}
protected abstract int getLayoutResourceId();
}
- 当点击首页 item 的时候,跳转到淘口令界面,并且需要把 cover,title,clickUrl 等数据传递过去,那我们就在 HomePagerContentAdapter 中创建一个接口把数据 dataBean 传出去
private OnListItemClickListener mItemClickListener = null;
public void setOnListItemClickListener(OnListItemClickListener listener){
this.mItemClickListener = listener;
}
public interface OnListItemClickListener {
void onItemClick(HomePagerContent.DataBean item);
}
@Override
public void onBindViewHolder(@NonNull InnerHolder holder, int position) {
HomePagerContent.DataBean dataBean = mData.get(position);
holder.setData(dataBean);
//设置点击事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mItemClickListener != null) {
mItemClickListener.onItemClick(dataBean);
}
}
});
}
- 在 LooperPagerAdapter 中也一样
private OnLooperPagerItemClickListener mItemClickListener = null;
public void setOnLooperPagerItemClickListener(OnLooperPagerItemClickListener listener){
this.mItemClickListener = listener;
}
public interface OnLooperPagerItemClickListener {
void onLooperItemClick(HomePagerContent.DataBean item);
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
int realPosition = position % mData.size();
HomePagerContent.DataBean dataBean = mData.get(realPosition);
Context context = container.getContext();
//创建图片
ImageView iv = new ImageView(context);
//加载图片数据
int measuredHeight = container.getMeasuredHeight();
int measuredWidth = container.getMeasuredWidth();
int size = (measuredWidth > measuredHeight ? measuredWidth : measuredHeight) / 2;
String looperCoverUrl = UrlUtils.getCoverPath(dataBean.getPict_url(), size);
Glide.with(context).load(looperCoverUrl).into(iv);
//创建布局
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
//给图片设置布局
iv.setLayoutParams(layoutParams);
//给图片设置比例类型
iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
//添加图片到container
container.addView(iv);
// 设置点击事件
iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mItemClickListener != null) {
mItemClickListener.onLooperItemClick(dataBean);
}
}
});
return iv;
}
- 在 HomePagerFragment 中设置接口并实现
@Override
protected void initListener() {
mHomePagerContentAdapter.setOnListItemClickListener(this);
mLooperPagerAdapter.setOnLooperPagerItemClickListener(this);
......
}
@Override
public void onItemClick(HomePagerContent.DataBean item) {
handleItemClick(item);
}
@Override
public void onLooperItemClick(HomePagerContent.DataBean item) {
handleItemClick(item);
}
private void handleItemClick(HomePagerContent.DataBean item) {
startActivity(new Intent(getContext(), TicketActivity.class));
}
定义淘口令相关接口
- Presenter 层接口 ITicketPresenter 只做获取淘口令一件事情
public interface ITicketPresenter extends IBasePresenter<ITicketCallBack> {
void getTicket(String title, String url, String cover);
}
- View 层接口 ITicketCallBack,显示图片和淘口令
public interface ITicketCallBack extends IBaseCallback {
void onTicketCodeLoaded(String cover, TicketModel ticketModel);
}
- TicketModel 是 Model 层,老师用的是 TicketResult,在 Api 里添加 Post 请求方法
@POST("tpwd")
Call<TicketModel> getTicket(@Body TicketParams ticketParams);
- 参数 TicketParams 包含两个字段
- body字段:url 要生成淘口令的url地址(必填)
- body字段:title 内容标题 (非必填)
public class TicketParams {
private String url;
private String title;
public TicketParams(String url, String title) {
this.url = url;
this.title = title;
}
}
请求淘口令数据
- 创建 TicketPresenterImpl 实现 ITicketPresenter,并实现方法,其中的 getTicket(String title, String url, String cover) 方法里的数据要从点击商品那里获取
- 创建单例 PresenterManager ,在其构造方法中新建 TicketPresenterImpl 对象,对外暴露一个公共的方法返回TicketPresenterImpl 的接口 ITicketPresenter,这样通过 PresenterManager 获取的 TicketPresenterImpl 也是单例而且看不出实现过程,同理,把 HomePresenterImpl 和 CategoryPagerPresenterImpl 也放进来
public class PresenterManager {
private static final PresenterManager ourInstance = new PresenterManager();
private final ITicketPresenter mTicketPresenter;
private final ICategoryPagerPresent mCategoryPagerPresent;
private final IHomePresenter mHomePresenter;
public static PresenterManager getInstance() {
return ourInstance;
}
private PresenterManager() {
mTicketPresenter = new TicketPresenterImpl();
mCategoryPagerPresent = new CategoryPagerPresenterImpl();
mHomePresenter = new HomePresenterImpl();
}
public ITicketPresenter getTicketPresenter() {
return mTicketPresenter;
}
public ICategoryPagerPresent getCategoryPagerPresent() {
return mCategoryPagerPresent;
}
public IHomePresenter getHomePresenter() {
return mHomePresenter;
}
}
- 这样就可以用 PresenterManager 创建的 TicketPresenterImpl 对象拿数据了
private void handleItemClick(HomePagerContent.DataBean item) {
String title = item.getTitle();
String url = item.getClick_url();
String cover = item.getPict_url();
ITicketPresenter ticketPresenter = PresenterManager.getInstance().getTicketPresenter();
ticketPresenter.getTicket(title,url,cover);
startActivity(new Intent(getContext(), TicketActivity.class));
}
- 然后 TicketPresenterImpl 就可以发起请求了
public class TicketPresenterImpl implements ITicketPresenter {
@Override
public void getTicket(String title, String url, String cover) {
LogUtils.e(TicketPresenterImpl.this, "title ---->" + title);
LogUtils.e(TicketPresenterImpl.this, "url ---->" + url);
LogUtils.e(TicketPresenterImpl.this, "cover ---->" + cover);
Retrofit retrofit = RetrofitManager.getInstance().getRetrofit();
Api api = retrofit.create(Api.class);
// 给url添加前缀 https
String ticketUrl = UrlUtils.getTicketUrl(url);
LogUtils.e(TicketPresenterImpl.this, "ticketUrl ---->" + ticketUrl);
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();
LogUtils.e(TicketPresenterImpl.this, "code ---->" + code);
if (code == HttpURLConnection.HTTP_OK) {
TicketModel result = response.body();
LogUtils.e(TicketPresenterImpl.this, "result ---->" + result.toString());
}
}
@Override
public void onFailure(Call<TicketModel> call, Throwable t) {
}
});
}
- 传入的 url 需要加前缀 https,要不加载淘口令数据为空,看 UrlUtils.getTicketUrl(url) 方法
public static String getTicketUrl(String url) {
if (url.startsWith("http") ) {
return url;
} else {
return "https:" + url;
}
}
- Log 一下

视频链接