当前位置: 首页 > article >正文

【Android】ViewPager的MVP架构搭建

ViewPager作用和使用场景

ViewPager 是 Android 中的一种滑动组件,允许用户左右滑动页面,提供了类似翻页的效果,通常用于实现多页面视图切换。它能够支持手势滑动,也可以通过编程来切换页面,使得内容展示更为流畅、直观。

常见的使用场景包括:

  • 引导页:在应用初次启动时展示介绍内容。
  • 图片浏览器:可用于相册或产品图片的滑动预览。
  • 新闻或文章内容的多标签页:使用户能够快速在不同主题或频道间切换。

实现ViewPager2

新建FragmentAdapter继承FragmentStateAdapter:

public class FragmentAdapter extends FragmentStateAdapter {

    private String[] titles;
    private List<Fragment> fragmentList;

    public FragmentAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle, String[] titles, List<Fragment> fragmentList) {
        super(fragmentManager, lifecycle);
        this.titles = titles;
        this.fragmentList = fragmentList;
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return fragmentList == null ? null : fragmentList.get(position);
    }

    @Override
    public int getItemCount() {
        return fragmentList == null ? 0:fragmentList.size();
    }
}

我们获取了fragmentList和titles,下来简单创建ViewPager2里的Fragment,HomePagerFragment:

public class HomePagerFragment extends Fragment {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.home_items_fragment, container, false);
        return view;
    }
}

HomeFragment:

public class HomeFragment extends BaseFragment<HomePresenter> {

    private SwipeRefreshLayout swipeRefreshLayout;
    private Handler handler;
    private ViewPager2 viewPager;
    private List<Fragment> fragmentList;
    private FragmentAdapter fragmentAdapter;
    private String[] titles;

    @Override
    protected void initListener() {

    }

    @Override
    protected void initView(View view) {
        viewPager = view.findViewById(R.id.view_pager);
        initData();
        fragmentAdapter = new FragmentAdapter(getChildFragmentManager(), getLifecycle(), titles, fragmentList);
        viewPager.setAdapter(fragmentAdapter);
    }


    @Override
    protected int getLayoutId() {
        return R.layout.home_fragment;
    }

    @Override
    public HomePresenter getPresenterInstance() {
        return new HomePresenter();
    }

    private void initData() {
        fragmentList = new ArrayList<>();
        fragmentList.add(new HomePagerFragment());
        fragmentList.add(new HomePagerFragment());
        fragmentList.add(new HomePagerFragment());
        titles = new String[]{"1", "2", "3"};
    }
}

实现了ViewPager的绑定。

使用MVP架构搭建

新建HomeView接口,定义setupViewPager方法:

public interface HomeView {
    void setupViewPager(List<Fragment> fragmentList, String[] titles);
}

定义了一个方法 setupViewPager,该方法的主要作用是配置 ViewPager 的内容。

HomeFragment:

public class HomeFragment extends BaseFragment<HomePresenter> implements HomeView{

    private SwipeRefreshLayout swipeRefreshLayout;
    private ViewPager2 viewPager;
    private FragmentAdapter fragmentAdapter;
    private Handler handler;

    @Override
    protected void initListener() {
    }

    @Override
    protected void initView(View view) {
        viewPager = view.findViewById(R.id.view_pager);
        // 初始化数据,通过Presenter获取数据
        mPresenter.loadFragments();
    }

    @Override
    protected int getLayoutId() {
        return R.layout.home_fragment;
    }

    @Override
    public HomePresenter getPresenterInstance() {
        return new HomePresenter();
    }

    // 更新ViewPager的数据
    public void setupViewPager(List<Fragment> fragmentList, String[] titles) {
        fragmentAdapter = new FragmentAdapter(getChildFragmentManager(), getLifecycle(), titles, fragmentList);
        viewPager.setAdapter(fragmentAdapter);
    }
}

setupViewPager::

HomeView 接口中定义的方法,用于配置 ViewPager2

  • 接收 fragmentListtitles 两个参数。
  • 初始化 FragmentAdapter,通过 getChildFragmentManager() 获取子 FragmentManager,并将 Fragment 列表、生命周期和标题传入适配器。
  • fragmentAdapter 设置给 viewPager 以显示内容。

HomeModel:

public class HomeModel extends BaseModel<HomePresenter> {

    public HomeModel(HomePresenter presenter) {
        super(presenter);
    }

    public List<Fragment> getFragmentList() {
        List<Fragment> fragmentList = new ArrayList<>();
        fragmentList.add(new HomePagerFragment());
        fragmentList.add(new HomePagerFragment());
        fragmentList.add(new HomePagerFragment());
        return fragmentList;
    }

    public String[] getTitles() {
        return new String[]{"Tab1", "Tab2", "Tab3"};
    }
}

HomeModel主要作用是提供数据,这里提供了fragmentList和titles。

HomePresenter:

public class HomePresenter extends BasePresenter<HomeModel, HomeFragment> {
    
    @Override
    public HomeModel getModelInstance() {
        return new HomeModel(this);
    }

    public void loadFragments() {
        List<Fragment> fragmentList = mModel.getFragmentList();
        String[] titles = mModel.getTitles();

        if (getmView() != null) {
            getmView().setupViewPager(fragmentList, titles);
        }
    }
}

HomePresenter 负责处理 HomeFragment 的业务逻辑,尤其是加载和配置 ViewPager 中的 Fragment

loadFragments() 方法

  • 从 mModel中获取 Fragment列表和标题。
    • mModel.getFragmentList():调用 Model 的方法,获取要显示的 Fragment 列表。
    • mModel.getTitles():调用 Model 的方法,获取每个 Fragment 的标题。
  • 使用 getmView() 方法获取当前视图(即 HomeFragment),并调用 setupViewPager() 方法,将 fragmentListtitles 传递给视图,更新 ViewPager 的内容。

使用MVP搭建的优点

  1. 解耦视图和逻辑,便于维护
  • 原版方式:通常在Fragment中直接初始化和管理ViewPager的数据,逻辑和视图代码耦合度较高,导致Fragment代码复杂且难以维护。
  • MVP方式:将数据逻辑放到PresenterModel中,Fragment只负责展示数据。这样清晰地分离了逻辑层和视图层,代码更加清晰且易于维护。
  1. 更好的可测试性
  • 原版方式:由于逻辑和UI代码混杂在一起,很难单独测试业务逻辑,导致测试覆盖率低。
  • MVP方式:逻辑部分集中在Presenter中,无需依赖Android UI框架即可进行单元测试,方便编写和执行测试代码,提升应用的测试覆盖率和质量。
  1. 提高可复用性
  • 原版方式:逻辑直接写在Fragment中,难以在多个地方复用。
  • MVP方式:Presenter中的业务逻辑可以被多个FragmentActivity复用,只需实现对应的视图接口即可。这样可以提高代码的复用率,降低开发时间。
  1. 代码结构更清晰
  • 原版方式:Fragment中既有逻辑又有视图代码,使得代码看起来杂乱无章。
  • MVP方式:代码职责明确,视图代码、逻辑代码和数据操作分散在不同的层中,使得项目结构更加清晰和模块化。开发人员可以更快地理解和扩展代码。
  1. 易于扩展功能
  • 原版方式:扩展功能时,可能需要在现有的Fragment中修改较多代码,容易产生错误。
  • MVP方式:通过修改Presenter中的业务逻辑,或在视图接口中添加方法,较少影响其他代码。这样可以更轻松地添加新功能。

已经到底啦!!


http://www.kler.cn/a/373103.html

相关文章:

  • 简缩极化模型+简缩极化求解用优化的方法,也需要保证方程和未知数个数
  • ElasticSearch备考 -- Index rollover
  • Centos下安装Maven(无坑版)
  • 从理解路由到实现一套Router(路由)
  • Kafka 与传统 MQ 消息系统之间有三个关键区别?
  • Jmeter基础篇(19)JSR223预处理器
  • 谷歌浏览器安装axure插件
  • 为什么音频采样率通常是44.1kHz?
  • css 对称按钮,中间斜平行间隔,两头半圆
  • 动手学深度学习64 注意力机制
  • 线性数据结构之数组
  • 基于 GADF+Swin-CNN-GAM 的高创新扰动信号识别模型!
  • 在深度学习研究方向有哪些创新点
  • AI驱动的图像文本提取【Llama 3.2-Vision】
  • CSS实现回到顶部且平滑过渡
  • Zoho x Zendure:借助Zoho One加速从0到1出海品牌搭建
  • 【速查笔记】单片机
  • 让卷积神经网络来辨识马和人
  • 【折腾一上午】Java POI 导出 Excel 自适应列宽行高
  • STM32FreeRTOS 使用QSPI驱动nandFlash
  • Sentinel底层如何计算京东双十一线上系统实时QPS
  • 【SAP FICO】八大业务_6货币资金管理
  • 挑战Java面试题复习第3天,无人扶我青云志
  • ELK Stack与Graylog:强大的日志分析和可视化工具
  • 分类算法——LightGBM 详解
  • 基于SSM+微信小程序的汽车维修管理系统(汽车5)