欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android ViewPager的MVP架構搭建過程

 更新時間:2024年10月28日 09:33:56   作者: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,下來簡單創(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

  • 接收 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 的業(yè)務邏輯,尤其是加載和配置 ViewPager 中的 Fragment。

loadFragments() 方法:

  • 從 mModel中獲取 Fragment列表和標題。
    • mModel.getFragmentList():調用 Model 的方法,獲取要顯示的 Fragment 列表。
    • mModel.getTitles():調用 Model 的方法,獲取每個 Fragment 的標題。
  • 使用 getmView() 方法獲取當前視圖(即 HomeFragment),并調用 setupViewPager() 方法,將 fragmentListtitles 傳遞給視圖,更新 ViewPager 的內容。

使用MVP搭建的優(yōu)點

解耦視圖和邏輯,便于維護

  • 原版方式:通常在Fragment中直接初始化和管理ViewPager的數據,邏輯和視圖代碼耦合度較高,導致Fragment代碼復雜且難以維護。
  • MVP方式:將數據邏輯放到PresenterModel中,Fragment只負責展示數據。這樣清晰地分離了邏輯層和視圖層,代碼更加清晰且易于維護。

更好的可測試性

  • 原版方式:由于邏輯和UI代碼混雜在一起,很難單獨測試業(yè)務邏輯,導致測試覆蓋率低。
  • MVP方式:邏輯部分集中在Presenter中,無需依賴Android UI框架即可進行單元測試,方便編寫和執(zhí)行測試代碼,提升應用的測試覆蓋率和質量。

提高可復用性

  • 原版方式:邏輯直接寫在Fragment中,難以在多個地方復用。
  • MVP方式:Presenter中的業(yè)務邏輯可以被多個FragmentActivity復用,只需實現對應的視圖接口即可。這樣可以提高代碼的復用率,降低開發(fā)時間。

代碼結構更清晰

  • 原版方式:Fragment中既有邏輯又有視圖代碼,使得代碼看起來雜亂無章。
  • MVP方式:代碼職責明確,視圖代碼、邏輯代碼和數據操作分散在不同的層中,使得項目結構更加清晰和模塊化。開發(fā)人員可以更快地理解和擴展代碼。

易于擴展功能

  • 原版方式:擴展功能時,可能需要在現有的Fragment中修改較多代碼,容易產生錯誤。
  • MVP方式:通過修改Presenter中的業(yè)務邏輯,或在視圖接口中添加方法,較少影響其他代碼。這樣可以更輕松地添加新功能。

已經到底啦??!

到此這篇關于 Android ViewPager的MVP架構搭建的文章就介紹到這了,更多相關 Android ViewPager的MVP架構內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java & Android 格式化字符串詳解

    java & Android 格式化字符串詳解

    這篇文章主要介紹了java & Android 格式化字符串詳解的相關資料,需要的朋友可以參考下
    2016-09-09
  • Android實現選擇相冊圖片并顯示功能

    Android實現選擇相冊圖片并顯示功能

    這篇文章主要為大家詳細介紹了Android實現選擇相冊圖片并顯示功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Android 動態(tài)改變SeekBar進度條顏色與滑塊顏色的實例代碼

    Android 動態(tài)改變SeekBar進度條顏色與滑塊顏色的實例代碼

    在上次android開發(fā)的項目中遇到個這樣的需求,要動態(tài)改變seekbar進度條顏色與滑塊顏色的需求,實現代碼也算比較簡單,對實現過程感興趣的朋友可以通過本文學習下
    2016-11-11
  • android 開發(fā)教程之日歷項目實踐(二)

    android 開發(fā)教程之日歷項目實踐(二)

    決定開始學習 Android 平臺下的軟件開發(fā),以日歷作為實踐項目,進行一周后,基本完成,有需要的朋友可以參考下
    2013-01-01
  • Android中WebView加載網頁設置進度條

    Android中WebView加載網頁設置進度條

    這篇文章主要為大家詳細介紹了Android中WebView加載網頁設置進度條的相關代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Android 側滑關閉Activity的實例

    Android 側滑關閉Activity的實例

    這篇文章主要介紹了Android 側滑關閉Activity的實例的相關資料,好的手機現在沒有物理返回鍵,或者說統(tǒng)一Android 與IOS 軟件功能的時候,需要側滑關閉,需要的朋友可以參考下
    2017-07-07
  • Android 自動完成文本框的實例

    Android 自動完成文本框的實例

    下面小編就為大家分享一篇Android 自動完成文本框的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Android實現京東App分類頁面效果

    Android實現京東App分類頁面效果

    這篇文章主要為大家詳細介紹了Android實現京東App分類頁面效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Android開發(fā)之DiffUtil的使用詳解

    Android開發(fā)之DiffUtil的使用詳解

    這篇文章文給大家介紹了DiffUtil的使用,相信大家每位Android開發(fā)者們都知道谷歌最近更新了Support Library 24.2.0,而DiffUtil就是在這個版本添加的一個工具類。下面就跟著小編一起來看看,有需要的可以參考借鑒。
    2016-09-09
  • Android實現用戶圓形頭像和模糊背景

    Android實現用戶圓形頭像和模糊背景

    這篇文章主要介紹了Android實現用戶圓形頭像和模糊背景 ,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04

最新評論