MVP初解

来源:互联网 发布:阿里云 北京 编辑:程序博客网 时间:2024/06/18 04:41
逻辑图:
  • Model层:数据层 ,主要有两个作用,一个是数据模型,一个是数据逻辑,所以我们需要一个bean,和一个逻辑类,也就是我们需要他去做的事情。为了更好的代码质量,所以,需要抽出一个逻辑的接口。让逻辑类继承接口
  • view 层 ,也即是视图层,一般在android中是,activity或者是fragment。我们需要写一个接口,让activity或fragment集成并且实现这个接口,
  • Presenter:这一层就是为了链接data和view作用得到,所以,我们就需要有,data的两个实例。接着就可以对数据进行处理了。代码如下:
  • Model:
    /** * Model,处理数据的接口,OnRequestListener是外部的一个回调接口 * Created by DELL on 2017/5/18. */public interface HistoryRecordBiz {    SQLiteDatabase db = DBHelperImp.instance.method().getWritableDatabase();    /**     * 获取数据     * @param listener     */    void obtainData( OnRequestListener<List<HistoryRecordBean>> listener);    /**     * 添加数据     */    void addData(HistoryRecordBean HistoryRecordBean, OnRequestListener<HistoryRecordBean>listener);}
    /** * HistoryRecordBiz,接口的实现,里面的是处理的具体方法 * Created by DELL on 2017/5/18. */public class HistoryRecordBizImp implements HistoryRecordBiz {    private static final String TAG = "HistoryRecordBizImp";    @Override    public void obtainData(OnRequestListener<List<HistoryRecordBean>> listener) {        Cursor cursor = db.rawQuery("select * from HistoryRecord order by id desc", null);        if (cursor.moveToFirst()) {            List<HistoryRecordBean> mData = new ArrayList<>();            do {                HistoryRecordBean hrb = new HistoryRecordBean();                hrb.setContent(cursor.getString(cursor.getColumnIndex("content")));                hrb.setTime(Long.parseLong(cursor.getString(cursor.getColumnIndex("date"))));                Log.d(TAG, "obtainData: hrb---->"+hrb);                mData.add(hrb);            } while (cursor.moveToNext());//            接口回调            listener.requestSuccess(mData);        } else {            listener.requestFailed("无历史记录");        }        cursor.close();    }    @Override    public void addData(HistoryRecordBean hrb, OnRequestListener<HistoryRecordBean> listener) {        ContentValues values = new ContentValues();        values.put("content", hrb.getContent());        values.put("time", hrb.getTimeStr());        values.put("date", hrb.getTime());        db.insert("HistoryRecord", null, values);        listener.requestSuccess(hrb);        values.clear();    }}
    /** * 外部的回调接口 * Created by DELL on 2017/5/18. */public interface OnRequestListener<T> {    /**     * 请求成功     * @param t     */    void requestSuccess(T t);    /**     * 请求失败     * @param s     */    void requestFailed(String s);}
  • view层:
    /** * 显示历史纪录的一个操作 * Created by DELL on 2017/5/18. */public interface HomeActivityView {    //    获取数据    HistoryRecordBean getHistoryRecordBean();    List<HistoryRecordBean> getHistoryRecordBeans();//    void showData( List<HistoryRecordBean> historyRecordBeans);    void addData(HistoryRecordBean historyRecordBean);    //清楚历史纪录    void clearContent();}
    /** * 实现了View的接口HomeActivityView * Created by DELL on 2017/5/5. */public class HomeActivity extends BaseActivity implements KeyboardChangeListener.keyboardListener, View.OnClickListener, HomeActivityView {    private static final String TAG = "HomeActivity";    private EditText et_input;    private TextView tv_clear;    private ImageView iv_search;    private RecyclerView rv_recycler;    private HistoryRecordAdapter mAdapter;    private List<HistoryRecordBean> mData = new ArrayList<>();    private DBHelperUtil helperUtil = DBHelperImp.instance.method();    private SQLiteDatabase db = helperUtil.getWritableDatabase();    private KeyboardChangeListener keyboardChangeListener;    private Toolbar toolbar;    private DrawerLayout mDrawerLayout;// presenter的实例    private HomeActivityPresenter presenter = new HomeActivityPresenter(this);    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        DBHelperImp.instance.method();//数据的显示        presenter.showData();        initView();    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        switch (item.getItemId()) {            case android.R.id.home:                Toast.makeText(this, "You have chosen the return key", Toast.LENGTH_SHORT).show();                break;            default:                break;        }        return true;    }    /**     * 初始化控件     */    private void initView() {        initRecycleView();        et_input = (EditText) findViewById(R.id.et_input);        tv_clear = (TextView) findViewById(R.id.tv_clear);        iv_search = (ImageView) findViewById(R.id.iv_search);        mDrawerLayout = (DrawerLayout) findViewById(R.id.activity_main);        keyboardChangeListener = new KeyboardChangeListener(this);        keyboardChangeListener.setKeyboardLisener(HomeActivity.this);        tv_clear.setClickable(true);        tv_clear.setOnClickListener(this);        iv_search.setClickable(true);        iv_search.setOnClickListener(this);        initTile();    }    private void initTile() {        toolbar = (Toolbar) findViewById(R.id.toolbar);        setSupportActionBar(toolbar);        ActionBar actionBar = getSupportActionBar();        if (actionBar != null) {//            这个就是ToolBar左侧的那个返回的按键            /**             * setDisplayHomeAsUpEnabled  这个就是ToolBar左侧的那个返回的按键             * setHomeAsUpIndicator  返回按键的图标             */            actionBar.setDisplayHomeAsUpEnabled(true);//            actionBar.setHomeAsUpIndicator(R.mipmap.ic_launcher);        }    }    private void serchData() {        HistoryRecordBean hrb = new HistoryRecordBean(et_input.getText().toString(), System.currentTimeMillis());        ContentValues values = new ContentValues();        values.put("content", hrb.getContent());        values.put("time", hrb.getTimeStr());        values.put("date", hrb.getTime());        db.insert("HistoryRecord", null, values);        values.clear();        mAdapter.addData(hrb);    }    /**     * 初始化RecycleView     */    private void initRecycleView() {        rv_recycler = (RecyclerView) findViewById(R.id.rv_recycler);//        线性布局        LinearLayoutManager layoutManager = new LinearLayoutManager(this);//        设置是横向的还是纵向的,默认为纵向        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);//        瀑布流//        StaggeredGridLayoutManager layoutManager =new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);        initAdapter();        rv_recycler.addItemDecoration(new DividerItemDecoration(this,                DividerItemDecoration.VERTICAL));        rv_recycler.setLayoutManager(layoutManager);    }    /**     * 初始化适配器     */    private void initAdapter() {        if (mData != null) {            Log.d(TAG, "initAdapter: 初始化适配器完成,数据已经传入");            mAdapter = new HistoryRecordAdapter(mData);            rv_recycler.setAdapter(mAdapter);            mAdapter.setOnItemClickListener(new HistoryRecordAdapter.OnItemClickListener() {                @Override                public void onItemClick(View view, int position) {                    et_input.setText(mData.get(position).getContent());                }            });        }    }    @Override    public void onKeyboardChange(boolean isShow, int keyboardHeight) {        if (isShow) {            Log.d(TAG, "onKeyboardChange: 弹起,高度=" + keyboardHeight);        } else {            Log.d(TAG, "onKeyboardChange: 落下,高度=" + keyboardHeight);        }    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.iv_search:                if (ToolUtil.isEmpty(et_input.getText().toString())) {                    Toast.makeText(this, "搜索内容不能为空", Toast.LENGTH_SHORT).show();                } else {//                    数据的添加                    presenter.addData();                }                break;            case R.id.tv_clear://                数据的清理                presenter.clearContent();                break;        }    }    @Override    public HistoryRecordBean getHistoryRecordBean() {        HistoryRecordBean historyRecordBean = new HistoryRecordBean(et_input.getText().toString(), System.currentTimeMillis());        Log.d(TAG, "getHistoryRecordBean: historyRecordBean---> " + historyRecordBean);        return historyRecordBean;    }    @Override    public List<HistoryRecordBean> getHistoryRecordBeans() {        return null;    }    @Override    public void showData(List<HistoryRecordBean> historyRecordBeans) {        mData = historyRecordBeans;    }    @Override    public void addData(HistoryRecordBean historyRecordBean) {        mAdapter.addData(historyRecordBean);    }    @Override    public void clearContent() {        mAdapter.clearData();        db.execSQL("delete from HistoryRecord");    }}
  • presenter层:
    /** * Created by DELL on 2017/5/18. */public class HomeActivityPresenter {    private static final String TAG = "HomeActivityPresenter";    private HistoryRecordBiz historyRecordBiz;    private HomeActivityView homeActivityView;    public HomeActivityPresenter(HomeActivityView homeActivityView) {        this.homeActivityView = homeActivityView;        this.historyRecordBiz = new HistoryRecordBizImp();    }    /**     * 数据的显示     */    public void showData(){        historyRecordBiz.obtainData( new OnRequestListener<List<HistoryRecordBean>>() {            @Override            public void requestSuccess(List<HistoryRecordBean> historyRecordBeen) {                homeActivityView.showData(historyRecordBeen);            }            @Override            public void requestFailed(String s) {                Log.d(TAG, "requestFailed: 无历史纪录");            }        });    }    /**     * 数据的添加     */    public void addData(){        historyRecordBiz.addData(homeActivityView.getHistoryRecordBean(), new OnRequestListener<HistoryRecordBean>() {            @Override            public void requestSuccess(HistoryRecordBean historyRecordBean) {                homeActivityView.addData(historyRecordBean);            }            @Override            public void requestFailed(String s) {                Log.d(TAG, "requestFailed: 添加数据失败");            }        });    }    /**     * 数据的清理     */    public void clearContent(){        homeActivityView.clearContent();    }}
  • 看过了代码,现在回顾下,首先,我有Model类,在这个类里面有操作bean的方法,也就是读写操作。然后,我在view中也有一个接口,不过这个接口是针对view界面的。这个界面,有三个操作,一个是显示内容,一个保存内容,还有一个就是数据的清理。显示内容就是调用,Model的showData方法,而保存就是调用addData方法。因为mvp是view和model没有数据通讯的,所以我们就需要presentter:具体的看代码吧。
原创粉丝点击