MVP初解

逻辑图:
  • 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:具体的看代码吧。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值