Android ViewPager的MVP架构搭建过程
作者:xiaoduyyy
本文主要介绍了ViewPager在Android中的作用以及使用场景,如引导页、图片浏览器、新闻或文章内容的多标签页等,同时,还详细阐述了如何通过MVP架构来搭建ViewPager,将视图和逻辑进行解耦,提高代码的可测试性、可复用性,使代码结构更清晰且易于扩展功能
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:
- 接收
fragmentList和titles两个参数。 - 初始化
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()方法,将fragmentList和titles传递给视图,更新ViewPager的内容。
使用MVP搭建的优点
解耦视图和逻辑,便于维护
- 原版方式:通常在
Fragment中直接初始化和管理ViewPager的数据,逻辑和视图代码耦合度较高,导致Fragment代码复杂且难以维护。 - MVP方式:将数据逻辑放到
Presenter和Model中,Fragment只负责展示数据。这样清晰地分离了逻辑层和视图层,代码更加清晰且易于维护。
更好的可测试性
- 原版方式:由于逻辑和UI代码混杂在一起,很难单独测试业务逻辑,导致测试覆盖率低。
- MVP方式:逻辑部分集中在
Presenter中,无需依赖Android UI框架即可进行单元测试,方便编写和执行测试代码,提升应用的测试覆盖率和质量。
提高可复用性
- 原版方式:逻辑直接写在
Fragment中,难以在多个地方复用。 - MVP方式:
Presenter中的业务逻辑可以被多个Fragment或Activity复用,只需实现对应的视图接口即可。这样可以提高代码的复用率,降低开发时间。
代码结构更清晰
- 原版方式:
Fragment中既有逻辑又有视图代码,使得代码看起来杂乱无章。 - MVP方式:代码职责明确,视图代码、逻辑代码和数据操作分散在不同的层中,使得项目结构更加清晰和模块化。开发人员可以更快地理解和扩展代码。
易于扩展功能
- 原版方式:扩展功能时,可能需要在现有的
Fragment中修改较多代码,容易产生错误。 - MVP方式:通过修改
Presenter中的业务逻辑,或在视图接口中添加方法,较少影响其他代码。这样可以更轻松地添加新功能。
已经到底啦!!
到此这篇关于 Android ViewPager的MVP架构搭建的文章就介绍到这了,更多相关 Android ViewPager的MVP架构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
