前言
- 之所以要把这两个页面写在一起,是因为这两个页面非常的相似,而且也没首页那种复杂的布局嵌套,主要就是理解MVP架构。我第一遍跟着老师视频写代码的时候对MVP架构理解的模模糊糊的,但把精选页面和特惠页面写完之后基本已经理解了。所以这两大节并没有什么新的知识点,presenter 层接口里为什么定义这几个方法,而 view 层里的接口为什么又是那几个方法,跟着老师的节奏写遍代码就能理解其中的原理,这就是肌肉记忆??下面的笔记是我写第二遍时觉得比较重要的地方,还有遇到的一些问题
笔记
精选页面显示默认数据
- 当我们第一次切换到精选页面时,精选页面的第一个分类背景应该是选中的状态,并在点击其他分类时切换背景
@Override
public void onBindViewHolder(@NonNull InnerHolder holder, int position) {
// private int currentPosition = 0;
if (position == currentPosition) {
holder.itemView.setBackgroundResource(R.color.color_selected_content_bg);
} else {
holder.itemView.setBackgroundResource(R.color.white);
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mItemClickListener != null && currentPosition != position) {
currentPosition = position;
notifyDataSetChanged();
mItemClickListener.onSelectedLeftItemClick(dataBean);
}
}
});
.......
}
public void setCategoryData(SelectedCategory selectedCategory) {
List<SelectedCategory.DataBean> data = selectedCategory.getData();
mData.clear();
mData.addAll(data);
notifyDataSetChanged();
if (mData.size() > 0) {
mItemClickListener.onSelectedLeftItemClick(mData.get(currentPosition));
}
}
public void setOnSelectedCategoryItemClickListener(OnSelectedCategoryItemClickListener listener) {
this.mItemClickListener = listener;
}
public interface OnSelectedCategoryItemClickListener {
void onSelectedLeftItemClick(SelectedCategory.DataBean item);
}
抽取布局 title
- 因为精选页面和特惠页面 title 布局一样,我们可以抽取出来,更重要的是在显示网络请求的数据之前,就能显示 title 内容
- 创建一个布局 fragment_with_header_container 作为 rootView ,并在里面挖个坑,用来显示页面网络加载的内容,id 还是 base_container
<?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:orientation="vertical">
<TextView
android:id="@+id/fragment_title"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/colorPrimary"
android:gravity="center_vertical"
android:paddingStart="15dp"
android:paddingEnd="12dp"
android:textColor="@color/white"
android:textSize="16sp"
tools:text="fragment title" />
<FrameLayout
android:id="@+id/base_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
- 分别在各自的 fragment 的 loadRootView 方法中加载布局,initView 方法中设置 title 文字,这里以精选页面为例
@Override
protected View loadRootView(LayoutInflater inflater, ViewGroup container) {
return inflater.inflate(R.layout.fragment_with_header_container, container, false);
}
@Override
protected void initView() {
fragmentTitle.setText("精选");
....
}
重构跳转到淘口令
- 三个界面的 item 点击跳转到淘口令界面的代码都是一样的,所以重构的必要性还是很大的
- 定义接口 IBaseInfo ,统一跳转到淘口令时的参数
public interface IBaseInfo {
String getPublicCover();
String getPublicTitle();
String getPublicUrl();
}
- 让 model 层实现 IBaseInfo(以精选页面为例)
public static class UatmTbkItemBean implements IBaseInfo{
@Override
public String getPublicCover() {
return getPict_url();
}
@Override
public String getPublicTitle() {
return getTitle();
}
@Override
public String getPublicUrl() {
return TextUtils.isEmpty(getCoupon_click_url()) ? getClick_url() : getCoupon_click_url();
}
......
}
- 创建 TicketUtil 类和 toTicketPage 方法跳转到淘口令
public class TicketUtil {
public static void toTicketPage(Context context, IBaseInfo baseInfo) {
String cover = baseInfo.getPublicCover();
String title = baseInfo.getPublicTitle();
String url = baseInfo.getPublicUrl();
ITicketPresenter ticketPresenter = PresenterManager.getInstance().getTicketPresenter();
ticketPresenter.getTicket(title, url, cover);
context.startActivity(new Intent(context, TicketActivity.class));
}
}
- 这样我们在跳转到淘口令界面时就可以用一个方法做到了
@Override
public void onSelectedRightItemClick(SelectedContent.DataBean.TbkUatmFavoritesItemGetResponseBean
.ResultsBean.UatmTbkItemBean dataBean) {
TicketUtil.toTicketPage(getContext(),dataBean);
}
关于 CardView
- 在设置精选界面时,我发现一个问题,明明设置的分类背景和内容背景是一样的,为什么在运行的时候会有很大的差别呢,而且内容的颜色明显更深,后来我发现是 CardView 的一个属性影响的
sob:cardElevation="6dp"
- 我设置的60dp,因为当时我想看看这个属性设置后的效果
- CardView 的背景,padding 等属性都要用它自带的属性设置,用 Android 的没作用
视频链接