逻辑图:
- 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:具体的看代码吧。