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,下來簡單創(chuàng)建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
的業(yè)務邏輯,尤其是加載和配置 ViewPager
中的 Fragment
。
loadFragments()
方法:
- 從 mModel中獲取 Fragment列表和標題。
mModel.getFragmentList()
:調用Model
的方法,獲取要顯示的Fragment
列表。mModel.getTitles()
:調用Model
的方法,獲取每個Fragment
的標題。
- 使用
getmView()
方法獲取當前視圖(即HomeFragment
),并調用setupViewPager()
方法,將fragmentList
和titles
傳遞給視圖,更新ViewPager
的內容。
使用MVP搭建的優(yōu)點
解耦視圖和邏輯,便于維護
- 原版方式:通常在
Fragment
中直接初始化和管理ViewPager
的數據,邏輯和視圖代碼耦合度較高,導致Fragment
代碼復雜且難以維護。 - MVP方式:將數據邏輯放到
Presenter
和Model
中,Fragment
只負責展示數據。這樣清晰地分離了邏輯層和視圖層,代碼更加清晰且易于維護。
更好的可測試性
- 原版方式:由于邏輯和UI代碼混雜在一起,很難單獨測試業(yè)務邏輯,導致測試覆蓋率低。
- MVP方式:邏輯部分集中在
Presenter
中,無需依賴Android UI框架即可進行單元測試,方便編寫和執(zhí)行測試代碼,提升應用的測試覆蓋率和質量。
提高可復用性
- 原版方式:邏輯直接寫在
Fragment
中,難以在多個地方復用。 - MVP方式:
Presenter
中的業(yè)務邏輯可以被多個Fragment
或Activity
復用,只需實現對應的視圖接口即可。這樣可以提高代碼的復用率,降低開發(fā)時間。
代碼結構更清晰
- 原版方式:
Fragment
中既有邏輯又有視圖代碼,使得代碼看起來雜亂無章。 - MVP方式:代碼職責明確,視圖代碼、邏輯代碼和數據操作分散在不同的層中,使得項目結構更加清晰和模塊化。開發(fā)人員可以更快地理解和擴展代碼。
易于擴展功能
- 原版方式:擴展功能時,可能需要在現有的
Fragment
中修改較多代碼,容易產生錯誤。 - MVP方式:通過修改
Presenter
中的業(yè)務邏輯,或在視圖接口中添加方法,較少影響其他代碼。這樣可以更輕松地添加新功能。
已經到底啦??!
到此這篇關于 Android ViewPager的MVP架構搭建的文章就介紹到這了,更多相關 Android ViewPager的MVP架構內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android 動態(tài)改變SeekBar進度條顏色與滑塊顏色的實例代碼
在上次android開發(fā)的項目中遇到個這樣的需求,要動態(tài)改變seekbar進度條顏色與滑塊顏色的需求,實現代碼也算比較簡單,對實現過程感興趣的朋友可以通過本文學習下2016-11-11