public void run() {
listener.onFinish(createPictures());
}
}, 2000);
}
private List createPictures() {
ArrayList pictures = new ArrayList<>();
for (int i = 0; i < pictureNames.length; i++) {
pictures.add(new Picture(pictureNames[i], pictureImages[i]));
}
return pictures;
}
}
大家看上面的代码,只有 loadPictures 是来自于接口的,为啥 createPictures 方法不写在接口里呢?主要是因为写在接口的方法是要在 P 中调用的。如果不需要外部调用,就没必要接口里面了。
V 的实现(只贴重要的代码):
public interface PictureView {
void showProgressBar();
void hideProgressBar();
void showMsg(String msg);
void showPictures(List pictures);
}
虽然 View 中只有 PictureView 一个类,但是从这个类可以对 view 要做的事一清二楚。
P 的实现(只贴重要的代码):
public class PicturePresenterImpl implements PicturePresenter, LoaderListener {
private PictureView mPictureView;
private PictureInteractor mInteractor;
public PicturePresenterImpl(PictureView pictureView) {
this.mPictureView = pictureView;
mInteractor = new PictureInteractorImpl();
}
@Override
public void onResume() {
mPictureView.showProgressBar();
mInteractor.loadPictures(this);
}
@Override
public void onDestroy() {
mPictureView = null;
}
@Override
public void onItemClick(int pos) {
mPictureView.showMsg(String.valueOf(pos));
}
@Override
public void onFinish(List pictures) {
mPictureView.hideProgressBar();
mPictureView.showPictures(pictures);
}
}
可以看出来,P 中其实就是对 M,V 的逻辑进行了封装,统一由其来掌控。
最后来讲讲 fragment,内部引入了 P 。主要是由于 P 无法控制生命周期,所以需要借用 fragment 的生命周期来对整个过程进行控制。
疑问?
大家看了上面的demo,不觉得在 fragment 中,即夹杂着 V, 又有 P,这样其实不利于维护,尤其是后期当 view 越来越多的时候,那时候,还要把 view 的初始化等等都写在 fragment 中嘛?所以接下去要对 fragment 内容进行瘦身。那怎么瘦身呢?具体请看下文。
改造
改造后的结构,只在 view 中新建了一个 BasePageView 来处理 view 的初始化和控制逻辑。
![](https://p3-juejin
.byteimg.com/tos-cn-i-k3u1fbpfcp/bfb33dae568f41a680f8fe2b857966c6~tplv-k3u1fbpfcp-zoom-1.image)
其代码具体如下:
public class BasePageView extends FrameLayout implements PictureView {
private RecyclerView mRecyclerView;
private ProgressBar mProgress;
private PictureAdapter mAdapter;
private PicturePresenter mPresenter;
private Context mContext;
/**
- 构造函数。
*/
public BasePageView(Context context){
this(context, null);
};
public BasePageView(Context context, AttributeSet attributeSet) {
this(context, attributeSet, 0);
}
public BasePageView(Context context, AttributeSet attributeSet, int defStyleAttr){
super(context, attributeSet, defStyleAttr);
init(context);
}
/**
- 初始化
*/
public void init(Context context) {
mContext = context;
inflate(mContext, R.layout.base_view_layout, this);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mProgress = (ProgressBar) findViewById(R.id.progress_bar);
mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext));
}
@Override
public void showProgressBar() {
mProgress.setVisibility(View.VISIBLE);
mRecyclerView.setVisibility(View.INVISIBLE);
}
@Override
public void hideProgressBar() {
mProgress.setVisibility(View.INVISIBLE);
mRecyclerView.setVisibility(View.VISIBLE);
}
@Override
public void showMsg(String msg) {
Toast.makeText(mContext, msg, Toast.LENGTH_LONG).show();
}
@Override
public void showPictures(List pictures) {
mAdapter = new PictureAdapter(pictures);
mAdapter.setRecyclerItemClickListener(new OnRecyclerItemClickListener() {
@Override
public void onItemClick(int pos) {
mPresenter.onItemClick(pos);
}
});
mRecyclerView.setAdapter(mAdapter);
}
}
这样当需要对视图进行更改的时候,只需要更改这个类就可以了,不用在跑到 fragment 中去了。
于此同时,fragment 也瘦身成功了: