课堂笔记
跳转到淘口令界面
- 创建 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 一下  
视频链接