基于RecyclerView封装的MVC开发模式
今天主要介绍下项目中运用到的UI框架,废话不多说,直接讲主要源码。
首先,将每个页面都看成是ListView的实现,每个Item是可以自定义布局View,自定义Model,这样才能呈现出不同的页面
先抽象出一个接口Cell,为什么叫Cell呢,因为它是细胞的意思,这个东西抽象出来就是为了能像细胞一样随意组合,当然是为了复用,下面贴出接口:
public interface Cell { void resetCell(View view); void setModel(CellModel model); void layoutSubviews(); } |
可以看到,resetCell方法,主要做View初始化操作,setModel方法绑定一个Model,最后一个方法就不说了。
抽象出这个具体在什么地方用呢?请看下面的代码:
@Override public void onBindViewHolder(BaseViewHolder holder, int position) { try { final CellModel item = getItem(position); holder.itemView.setTag(item); bindItemViewClickListener(holder, position); Cell cell = item.cell; cell.resetCell(holder.itemView); cell.setModel(item); cell.layoutSubviews(); } catch (Exception e) { if (adapterInterface != null) { adapterInterface.getException(e); } } } |
看方法名,用过RecyclerView的都知道,这里是绑定数据用的,平时用的过程中我们习惯在ViewHolder中去初始化View,在这我把它放到Cell 中,就是为了把这部分东西抽象出来,便于复用,下面再看个方法:
@Overridepublic BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { BaseViewHolder viewHolder = null; try { CellModel cellModel = mList.get(viewType); View view = inflateItemView(parent, cellModel.layout); viewHolder = new BaseViewHolder(view); } catch (Exception e) { if (adapterInterface != null) { adapterInterface.getException(e); } } return viewHolder; } |
public class CellModel { public int layout = 0; public Cell cell=null; } |
这个是创建ViewHolder的方法,这里面用到了Model的基类,两个属性,layout就是Item布局,然后对应的一个Cell,它俩是一对一的关系,大家知道这个ViewType的意思,有多少个ViewType就有多少个布局,假设说每个布局都不一样我们怎么弄呢,重写下面的方法返回Position即可,然后你就可以拿着ViewType当Position用了,耍点小聪明
@Overridepublic int getItemViewType(int position) { return position; } |
就是这样,Adapter里面的核心就这么多,当然还有个要点,方法里面有个adaperInterface.getException(),这个主要是为了异常向下传递,便于实现处理。
最后简化activity中的代码,将activity真正的当作一个View使用,那么我们就需要再抽象出一个控制器Control,我们取名为DataSources
大概是这么实现的:
public abstract class DataSources implements DataInterface, AdapterInterface { private List<CellModel> mModelList; private DataListAdapter mDataListAdapter; public DataSources() { init(); } private void init() { mModelList = new ArrayList<>(); mDataListAdapter = new DataListAdapter(mModelList); mDataListAdapter.setAdapterInterface(this); onLoadModel(mModelList); } public void addItem(CellModel cellModel) { mDataListAdapter.add(cellModel); } public DataListAdapter getDataListAdapter() { return this.mDataListAdapter; } @Override public void getException(Exception e) { Log.e(this.getClass().getSimpleName(), e.toString()); } } |
这里抽象出来主要是把数据交给Adapter,下面我贴出来一个例子:
1,
public class DemoCell implements Cell {
TextView text;
@Override
public void resetCell(View view) {
text= (TextView) view.findViewById(R.id.text_app);
}
@Override
public void setModel(CellModel model) {
DemoCellModel demoCellModel= (DemoCellModel) model;
text.setText(demoCellModel.text);
}
@Override
public void layoutSubviews() {
}2,
public class DemoCellModel extends CellModel {
public String text;
}
3,
public class DemoDataSources extends DataSources {
@Override
public void onRequestSuccess(int code, String response) {
}
@Override
public void onRequestFailure(int errCode, String errMsg) {
}
@Override
public void onLoadModel(List list) {
for (int i = 0; i < 10; i++) {
DemoCellModel demoCellModel = new DemoCellModel();
demoCellModel.cell = new DemoCell();
if (i % 2 == 0) {
demoCellModel.layout = R.layout.cell;
demoCellModel.text = "测试" + i;
} else {
demoCellModel.layout = R.layout.cellt;
demoCellModel.text = "跳转至MVVM模式Activity";
}
list.add(demoCellModel);
}
}
}
4,
public class MVCActivity extends AppCompatActivity {
CusRecyclerView cusRecyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mvc);
DataSources dataResources = new DemoDataSources();
cusRecyclerView = (CusRecyclerView) findViewById(R.id.cusRecyclerView);
cusRecyclerView.setLayoutManager(new LinearLayoutManager(this));
cusRecyclerView.setDataResources(dataResources);
dataResources.getDataListAdapter().setOnItemClickListener(new DataListAdapter.OnItemClickListener() {
@Override
public void onClick(View view, int position) {
CellModel model = (DemoCellModel) view.getTag();
Toast.makeText(getApplicationContext(), model.layout, Toast.LENGTH_LONG).show();
if (model.layout == R.layout.cellt) {
startActivity(new Intent(MVCActivity.this, MVVMActivity.class));
}
}
});
}
}//最后贴出github分享地址 https://github.com/zzyandroid0425/experience 一起学习共同进步