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

【Android】ViewPager的MVP架构搭建

【Android】ViewPager2的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@Overridepublic Fragment createFragment(int position) {return fragmentList == null ? null : fragmentList.get(position);}@Overridepublic int getItemCount() {return fragmentList == null ? 0:fragmentList.size();}
}

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

public class HomePagerFragment extends Fragment {@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);}@Nullable@Overridepublic 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;@Overrideprotected void initListener() {}@Overrideprotected void initView(View view) {viewPager = view.findViewById(R.id.view_pager);initData();fragmentAdapter = new FragmentAdapter(getChildFragmentManager(), getLifecycle(), titles, fragmentList);viewPager.setAdapter(fragmentAdapter);}@Overrideprotected int getLayoutId() {return R.layout.home_fragment;}@Overridepublic 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;@Overrideprotected void initListener() {}@Overrideprotected void initView(View view) {viewPager = view.findViewById(R.id.view_pager);// 初始化数据,通过Presenter获取数据mPresenter.loadFragments();}@Overrideprotected int getLayoutId() {return R.layout.home_fragment;}@Overridepublic 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> {@Overridepublic 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.mrgr.cn/news/59815.html

相关文章:

  • HTTP协议解析(http/1、2、3)
  • Android 原生开发与Harmony原生开发浅析
  • SpringCloud Gateway路由核心原理解析
  • 计算机网络-CSMA/CD协议笔记及“争用期”的理解
  • LabVIEW显微镜自动对焦系统
  • MATLAB人脸考勤系统
  • 嵌入式——STM32外设应用
  • stm32的boot引脚接线
  • 《CUDA编程》10.线程束的基本函数与协作组
  • C++和Java该如何进行选择?
  • C++中获取硬盘ID的方法
  • 鸿蒙文本组件高级特性——富文本属性字符串
  • Python记录-字典
  • 设计模式(二)
  • ROM修改进阶教程------简单通过指令来修改系统安全设置中选项的的开启或者关闭 内置指令在rom中的应用
  • 从零实现数据结构:一文搞定所有排序!(下集)
  • 网络文件系统nfs实验1
  • 基于neo4j关系图谱的协同过滤科研推荐系统
  • 工具方法 - Omnifocus: 网页版基本操作
  • 软考:软件建模的抽象级别
  • 解读AVL树:平衡二叉搜索树的奥秘
  • hdlbits系列verilog解答(DFF8-8位D触发器)-81
  • android openGL ES详解——缓冲区VBO/VAO/EBO/FBO/离屏渲染
  • 高速大容量还自带原厂数据恢复服务,希捷睿翼4TB移动硬盘评测
  • Python酷库之旅-第三方库Pandas(170)
  • css-画一个三角形