Android ViewPager的MVP架構(gòu)搭建過(guò)程
ViewPager作用和使用場(chǎng)景
ViewPager 是 Android 中的一種滑動(dòng)組件,允許用戶左右滑動(dòng)頁(yè)面,提供了類似翻頁(yè)的效果,通常用于實(shí)現(xiàn)多頁(yè)面視圖切換。它能夠支持手勢(shì)滑動(dòng),也可以通過(guò)編程來(lái)切換頁(yè)面,使得內(nèi)容展示更為流暢、直觀。
常見(jiàn)的使用場(chǎng)景包括:
- 引導(dǎo)頁(yè):在應(yīng)用初次啟動(dòng)時(shí)展示介紹內(nèi)容。
- 圖片瀏覽器:可用于相冊(cè)或產(chǎn)品圖片的滑動(dòng)預(yù)覽。
- 新聞或文章內(nèi)容的多標(biāo)簽頁(yè):使用戶能夠快速在不同主題或頻道間切換。
實(shí)現(xiàn)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,下來(lái)簡(jiǎn)單創(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"};
}
}實(shí)現(xiàn)了ViewPager的綁定。
使用MVP架構(gòu)搭建
新建HomeView接口,定義setupViewPager方法:
public interface HomeView {
void setupViewPager(List<Fragment> fragmentList, String[] titles);
}定義了一個(gè)方法 setupViewPager,該方法的主要作用是配置 ViewPager 的內(nèi)容。
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);
// 初始化數(shù)據(jù),通過(guò)Presenter獲取數(shù)據(jù)
mPresenter.loadFragments();
}
@Override
protected int getLayoutId() {
return R.layout.home_fragment;
}
@Override
public HomePresenter getPresenterInstance() {
return new HomePresenter();
}
// 更新ViewPager的數(shù)據(jù)
public void setupViewPager(List<Fragment> fragmentList, String[] titles) {
fragmentAdapter = new FragmentAdapter(getChildFragmentManager(), getLifecycle(), titles, fragmentList);
viewPager.setAdapter(fragmentAdapter);
}
}setupViewPager::
HomeView接口中定義的方法,用于配置ViewPager2:
- 接收
fragmentList和titles兩個(gè)參數(shù)。 - 初始化
FragmentAdapter,通過(guò)getChildFragmentManager()獲取子FragmentManager,并將Fragment列表、生命周期和標(biāo)題傳入適配器。 - 將
fragmentAdapter設(shè)置給viewPager以顯示內(nèi)容。
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主要作用是提供數(shù)據(jù),這里提供了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 負(fù)責(zé)處理 HomeFragment 的業(yè)務(wù)邏輯,尤其是加載和配置 ViewPager 中的 Fragment。
loadFragments()方法:
- 從 mModel中獲取 Fragment列表和標(biāo)題。
mModel.getFragmentList():調(diào)用Model的方法,獲取要顯示的Fragment列表。mModel.getTitles():調(diào)用Model的方法,獲取每個(gè)Fragment的標(biāo)題。
- 使用
getmView()方法獲取當(dāng)前視圖(即HomeFragment),并調(diào)用setupViewPager()方法,將fragmentList和titles傳遞給視圖,更新ViewPager的內(nèi)容。
使用MVP搭建的優(yōu)點(diǎn)
解耦視圖和邏輯,便于維護(hù)
- 原版方式:通常在
Fragment中直接初始化和管理ViewPager的數(shù)據(jù),邏輯和視圖代碼耦合度較高,導(dǎo)致Fragment代碼復(fù)雜且難以維護(hù)。 - MVP方式:將數(shù)據(jù)邏輯放到
Presenter和Model中,Fragment只負(fù)責(zé)展示數(shù)據(jù)。這樣清晰地分離了邏輯層和視圖層,代碼更加清晰且易于維護(hù)。
更好的可測(cè)試性
- 原版方式:由于邏輯和UI代碼混雜在一起,很難單獨(dú)測(cè)試業(yè)務(wù)邏輯,導(dǎo)致測(cè)試覆蓋率低。
- MVP方式:邏輯部分集中在
Presenter中,無(wú)需依賴Android UI框架即可進(jìn)行單元測(cè)試,方便編寫(xiě)和執(zhí)行測(cè)試代碼,提升應(yīng)用的測(cè)試覆蓋率和質(zhì)量。
提高可復(fù)用性
- 原版方式:邏輯直接寫(xiě)在
Fragment中,難以在多個(gè)地方復(fù)用。 - MVP方式:
Presenter中的業(yè)務(wù)邏輯可以被多個(gè)Fragment或Activity復(fù)用,只需實(shí)現(xiàn)對(duì)應(yīng)的視圖接口即可。這樣可以提高代碼的復(fù)用率,降低開(kāi)發(fā)時(shí)間。
代碼結(jié)構(gòu)更清晰
- 原版方式:
Fragment中既有邏輯又有視圖代碼,使得代碼看起來(lái)雜亂無(wú)章。 - MVP方式:代碼職責(zé)明確,視圖代碼、邏輯代碼和數(shù)據(jù)操作分散在不同的層中,使得項(xiàng)目結(jié)構(gòu)更加清晰和模塊化。開(kāi)發(fā)人員可以更快地理解和擴(kuò)展代碼。
易于擴(kuò)展功能
- 原版方式:擴(kuò)展功能時(shí),可能需要在現(xiàn)有的
Fragment中修改較多代碼,容易產(chǎn)生錯(cuò)誤。 - MVP方式:通過(guò)修改
Presenter中的業(yè)務(wù)邏輯,或在視圖接口中添加方法,較少影響其他代碼。這樣可以更輕松地添加新功能。
已經(jīng)到底啦!!
到此這篇關(guān)于 Android ViewPager的MVP架構(gòu)搭建的文章就介紹到這了,更多相關(guān) Android ViewPager的MVP架構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android實(shí)現(xiàn)選擇相冊(cè)圖片并顯示功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)選擇相冊(cè)圖片并顯示功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
Android 動(dòng)態(tài)改變SeekBar進(jìn)度條顏色與滑塊顏色的實(shí)例代碼
在上次android開(kāi)發(fā)的項(xiàng)目中遇到個(gè)這樣的需求,要?jiǎng)討B(tài)改變seekbar進(jìn)度條顏色與滑塊顏色的需求,實(shí)現(xiàn)代碼也算比較簡(jiǎn)單,對(duì)實(shí)現(xiàn)過(guò)程感興趣的朋友可以通過(guò)本文學(xué)習(xí)下2016-11-11
android 開(kāi)發(fā)教程之日歷項(xiàng)目實(shí)踐(二)
決定開(kāi)始學(xué)習(xí) Android 平臺(tái)下的軟件開(kāi)發(fā),以日歷作為實(shí)踐項(xiàng)目,進(jìn)行一周后,基本完成,有需要的朋友可以參考下2013-01-01
Android中WebView加載網(wǎng)頁(yè)設(shè)置進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android中WebView加載網(wǎng)頁(yè)設(shè)置進(jìn)度條的相關(guān)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
Android 側(cè)滑關(guān)閉Activity的實(shí)例
這篇文章主要介紹了Android 側(cè)滑關(guān)閉Activity的實(shí)例的相關(guān)資料,好的手機(jī)現(xiàn)在沒(méi)有物理返回鍵,或者說(shuō)統(tǒng)一Android 與IOS 軟件功能的時(shí)候,需要側(cè)滑關(guān)閉,需要的朋友可以參考下2017-07-07
Android實(shí)現(xiàn)京東App分類頁(yè)面效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)京東App分類頁(yè)面效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
Android開(kāi)發(fā)之DiffUtil的使用詳解
這篇文章文給大家介紹了DiffUtil的使用,相信大家每位Android開(kāi)發(fā)者們都知道谷歌最近更新了Support Library 24.2.0,而DiffUtil就是在這個(gè)版本添加的一個(gè)工具類。下面就跟著小編一起來(lái)看看,有需要的可以參考借鑒。2016-09-09
Android實(shí)現(xiàn)用戶圓形頭像和模糊背景
這篇文章主要介紹了Android實(shí)現(xiàn)用戶圓形頭像和模糊背景 ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04

