Android MVP BaseFragment 通用式封装的实现

确保大家都了解,MVP是一种常用的Android应用程序架构模式,MVP可以帮助开发者将代码按照模块化的方式组织,并提供了一种分离视图层和逻辑层的方法。

在开发Android应用时,BaseFragment的使用可以帮助我们更好地管理Fragment的生命周期和提高我们代码的复用性。在本篇攻略中,我们将讲解如何使用MVP和BaseFragment将Android应用程序的开发过程继续拆分。

一、概述

1.1 什么是 MVP

模型 - 视图 - 展示器(MVP)是一种软件开发模式,它把程序分成三个部分: Model(数据模型)、View(用户界面)、Presenter(展示器)。

在MVP中,数据模型(Model)是纯Java对象,有具体的实现和接口。用户界面(View)是Activity、Fragment或视图部分。 展示器(Presenter)是连接模型(Model)和界面(View)的桥梁,在展示器中处理一些业务逻辑和界面逻辑。

1.2 BaseFragment 的优势

BaseFragment是一个通用模板类,它可以让代码和逻辑在各自的模块中进行处理,使得我们代码更容易维护和扩展。通过使用BaseFragment,我们可以很方便地重复使用代码和逻辑,它可以帮助我们避免代码重复,提高代码的可读性和可维护性。

二、实践

2.1 BaseFragment 的实现

public abstract class BaseFragment<V extends IMvpView, P extends IMvpPresenter<V>> extends Fragment implements IMvpView {

    // 展示器
    protected P mPresenter;

    @SuppressWarnings("unchecked")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPresenter = createPresenter();
        if (mPresenter != null) {
            mPresenter.attachView((V) this);
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mPresenter != null) {
            mPresenter.detachView();
        }
    }

    // 获取展示器实例
    protected abstract P createPresenter();
}

在这里我们定义了一个抽象化的BaseFragment类,它实现了IMvpView中的方法,同时将Presenter类的引用交给了当前的Fragment,这样就可以充分利用Presenter来分离各个组件之间的业务逻辑。

2.2 MVP架构的具体实现

接下来我们来看如何实现一个简单的登陆界面,我们将会演示如何利用MVP将其分解。

2.2.1 LoginActivity

public class LoginActivity extends BaseFragment<ILoginView, LoginPresenter<ILoginView>> implements ILoginView {

    private Button mBtnLogin;

    @Override
    protected LoginPresenter<ILoginView> createPresenter() {
        return new LoginPresenter<ILoginView>();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_login, container, false);
        mBtnLogin = (Button) view.findViewById(R.id.btn_login);
        mBtnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mPresenter.login();
            }
        });
        return view;
    }

    @Override
    public void showLoginSuccess() {
        Toast.makeText(getActivity(), "登录成功", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void showLoginFailed() {
        Toast.makeText(getActivity(), "用户名或密码错误", Toast.LENGTH_SHORT).show();
    }
}

在登陆界面的代码中,我们可以看到继续了BaseFragment,我们通过泛型继承了ILoginView,通过createPresenter()方法实例化Presenter对象,并在mBtnLogin的CLICK事件中调用LoginPresenter的login()方法。

2.2.2 LoginPresenter

public class LoginPresenter<V extends ILoginView> extends BaseMvpPresenter<V> {

    public void login() {
        getView().showLoginSuccess();
    }
}

在Presenter中,我们从BaseMvpPresenter中继承了getView()的实现,并在login()方法中调用对应的View接口来显示登录成功信息。

2.3 另一个示例

除了登录界面外,我们也可以应用MVP架构进行RecyclerView的封装。

2.3.1 RecyclerViewActivity

public class RecyclerViewActivity extends BaseFragment<IRecyclerViewView, RecyclerViewPresenter<IRecyclerViewView>> implements IRecyclerViewView {

    private RecyclerView mRvList;

    private RecyclerViewAdapter mAdapter;
    private List<String> mDataList;

    @Override
    protected RecyclerViewPresenter<IRecyclerViewView> createPresenter() {
        return new RecyclerViewPresenter<>();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_recycler_view, container, false);
        mRvList = (RecyclerView) view.findViewById(R.id.rv_list);

        mDataList = new ArrayList<>();
        mAdapter = new RecyclerViewAdapter(mDataList);
        mRvList.setLayoutManager(new LinearLayoutManager(getActivity()));
        mRvList.setAdapter(mAdapter);

        mPresenter.loadData();
        return view;
    }

    @Override
    public void onDataLoaded(List<String> dataList) {
        mDataList.clear();
        mDataList.addAll(dataList);
        mAdapter.notifyDataSetChanged();
        Toast.makeText(getActivity(), "数据加载完成", Toast.LENGTH_SHORT).show();
    }
}

在RecyclerViewActivity中,我们先在Activity中初始化了RecyclerView,并在onDataLoaded()方法中,使用mAdapter.notifyDataSetChanged()来更新RecyclerView的界面。

2.3.2 RecyclerViewPresenter

public class RecyclerViewPresenter<V extends IRecyclerViewView> extends BaseMvpPresenter<V> {

    public void loadData() {
        List<String> dataList = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            dataList.add("第" + (i + 1) + "条数据");
        }
        getView().onDataLoaded(dataList);
    }
}

在Presenter中,我们仍然继承了BaseMvpPresenter,同时也定义了loadData()方法来获取数据列表,然后在获取成功后,通过对应的View方法显示数据。

三、总结

通过这篇文章,我们了解了MVP和BaseFragment的运用方法,并在实际应用中进行了尝试。使用这些对象可以更好地让我们的代码和逻辑分离,增强了程序的可读性和可维护性。如果你还没有开始使用这种设计方法,那么从今天起就可以开始尝试。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android MVP BaseFragment 通用式封装的实现 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 关于java:atscala项目 编译器错误-无法解析符号列表?

    Java:atscala项目编译器错误-无法解析符号列表 在Java开发中,有时会遇到编译器错误,例如“无法解析符号列表”。这种错误通常是由于缺少依赖项或类路径引起的。以下是关于Java:atscala项目编译器错误-无法解析符号列表的完整攻略,包括常见问题和两个示例说明。 常见问题 1. 缺少依赖项 在Java开发中,如果项目依赖于其他库或框架,但缺少这些…

    other 2023年5月9日
    00
  • MySql字符串拆分实现split功能(字段分割转列)

    MySql字符串拆分实现split功能(字段分割转列) 在 MySql 中,没有类似 Python 中的 split 函数,可以方便地将字符串分割,但可以用以下方法实现类似 split 的功能,即将字符串拆分并分成多个字段。 步骤 创建一个数字表,用于生成序列号,数字表的个数可以根据要拆分字符串的最大长度来决定。 mysql CREATE TABLE seq…

    other 2023年6月25日
    00
  • [下载]Win10 Build 10147 64位ISO镜像和语言包下载地址泄露

    [下载]Win10 Build 10147 64位ISO镜像和语言包下载地址泄露攻略 简介 本攻略将详细讲解如何获取并下载Win10 Build 10147 64位ISO镜像和语言包下载地址。请注意,这些下载地址的泄露可能涉及非法行为,我们强烈建议您遵守相关法律法规并仅在合法途径下获取软件。 步骤 步骤一:搜索相关信息 首先,您需要搜索相关信息以获取Win1…

    other 2023年8月5日
    00
  • android自定义控件实现简易时间轴(1)

    下面是我对“android自定义控件实现简易时间轴(1)”的详细讲解及实现攻略: 1. 确定需求和设计思路 在开始实现自定义控件之前,我们需要明确自己的需求和设计思路。本例中,我们要实现一个简易的时间轴控件,需要显示多条时间线,每条时间线上可以显示多个时间点,并且用户可以根据需要设置时间点的颜色和描述信息。同时,控件的整体样式应该美观、简洁。 为了实现上述功…

    other 2023年6月27日
    00
  • 电脑安装cad后word打不开无法初始化该怎么办?

    问题描述:在安装CAD软件后,打开Word可能会出现无法初始化的错误提示。 解决方案如下: 1.卸载不兼容的插件或升级插件版本 有时候Word可能会与CAD软件安装的某些插件不兼容,导致打开Word时出现无法初始化的错误。此时可以尝试卸载这些插件或将其升级到最新版本。 比如,有网友反映网上流传的“AcadInventor.dll”插件和Word2010不兼容…

    other 2023年6月20日
    00
  • pythontreelib多叉树数据结构中文使用帮助文档

    pythontreelib多叉树数据结构中文使用帮助文档 pythontreelib 是一个 Python 库,提供了多叉树数据结构的实现。本文将详细讲解如何使用 pyontreelib 进行多叉树数据结构的操作。 安装 使用 pythontreelib 进行多叉树数据结构的操作需要先安装该库。可以使用以下命令进行安装: pip install python…

    other 2023年5月9日
    00
  • Excel如何在单元格内批量加前缀或后缀?

    当你需要在Excel中批量给单元格添加前缀或后缀时,可以使用以下步骤: 首先,打开Excel并选择你要操作的工作表。 选中你要添加前缀或后缀的单元格范围。你可以使用鼠标拖动来选中多个单元格,或者按住Ctrl键并单击选择多个单元格。 在Excel的顶部菜单栏中,点击\”开始\”选项卡。 在\”编辑\”组中,找到并点击\”查找和替换\”按钮。这将打开一个弹出窗口…

    other 2023年8月5日
    00
  • js手机号码简单正则校验

    js手机号码简单正则校验 在网页开发中,我们常常需要对用户输入进行校验,以保证数据的合法性和正确性。手机号码是我们常常需要验证的一个输入项,本文将介绍如何使用Javascript实现手机号码的简单正则校验。 1. 正则表达式 正则表达式是一种用来匹配字符串的模式,它由一些特定的字符和元字符组成。在进行手机号码校验时,我们需要用到以下正则表达式: /^1[34…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部