基于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(holderposition);
        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(parentcellModel.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 DataInterfaceAdapterInterface {

    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 一起学习共同进步