1. 程式人生 > >Android入門筆記(五)

Android入門筆記(五)

五、ViewPager

5.1 ViewPager 的作用

為 UI 新增 ViewPager 後,使用者可以左右滑動螢幕,切換檢視不同列表項的明細頁面。

5.2 ViewPager 的實現

(1)建立佈局檔案,設定根元素為 ViewPager,可命名為:activity_article_pager.xml(注意命名規則)。

(2)建立託管 fragment 的 activity 檔案,可命名為:ArticlePagerActivity.java(注意命名規則)。

(3)在 activity 中設定 ViewPager 屬性,並在 onCreate 方法中完成該屬性的例項化(通過 findViewById 方法),之後通過 getSupportFragmentManager 方法來獲取一個 FragmentManager 例項,之後通過使用 ViewPager.setAdapter 方法為屬性 ViewPager 繫結一個 pagerAdapter 。

(4)在 setAdapter 的引數列表中例項化一個 FragmentStatePagerAdapter 例項,這個例項的建構函式需要提供一個 FragmentManager 例項 ,即可使用上面例項化的 fragmentManager 。FragmentStatePagerAdapter 的作用可以理解為代理,一方面他完成了將返回的 fragment 新增給託管的 activity ,另一方面他幫助 ViewPager 找到 fragment 的檢視並一一對應。

(5)重寫 FragmentStatePagerAdapter 中的 getItem(int position) 方法,通過 position 引數可在資料列表(該頁面應儲存資料列表資訊)中定位到該 fragment 的資料,獲取到資料後通過使用 fragment 中的 newInstance 方法來將資料資訊傳入後來例項化 fragment。

(6)重寫 FragmentStatePagetAdapter 中的 getCount() 方法,返回值為資料列表中資料的個數。

(7)這時從列表進入該滑動頁面時是從第一項開始的,這是屬性預設的。我們應當在該 activity 的 onCreate 方法中新增一段迴圈匹配的程式碼,當查詢到特定頁面時,使用 ViewPager.setCurrentItem(int position) 方法來將該頁面設定為進入時的預設頁面。

    private class ArticleAdapter extends RecyclerView.Adapter<ArticleHolder> {

        private List<Article> mArticles;

        public ArticleAdapter(List<Article> articles) {
            mArticles = articles;
        }

        @NonNull
        @Override
        public ArticleHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

            LayoutInflater inflater = LayoutInflater.from(getActivity());

            return new ArticleHolder(inflater, viewGroup);
        }

        @Override
        public void onBindViewHolder(@NonNull ArticleHolder articleHolder, int i) {
            Article article = mArticles.get(i);
            articleHolder.bind(article);
        }

        @Override
        public int getItemCount() {
            return mArticles.size();
        }
    }

5.3 FragmentStatePagerAdapter 和 FragmentPagerAdapter

FragmentStatePagerAdapter:這個方法中的 state 表明,在銷燬 fragment 時,可在 onSaveInstance (Bundle) 方法中儲存 fragment 的 Bundle 資訊。使用者切換回來時,儲存的例項可用來生成新的 fragment。因為 FragmentStatePagerAdapter 會銷燬 fragment ,所以其相對來說跟節省記憶體,當頁面需要儲存大量資料時,應當使用這種方法。

FragmentPagerAdapter:對於不再需要的 fragment , FragmentPagerAdapter 會選擇呼叫事務的 detach (Fragment) 方法來處理它,而非 remove (Fragment) 方法。也就是說,FragmentPagerAdapter 只是銷燬了 fragment 的檢視,而 fragment 例項還保留在 FragmentManager 中。因此,FragmentPagerAdapter 建立的 fragment 永遠不會被銷燬。所以,當用戶頁面只有少量且固定的 fragment 時,這個方法是安全合適的選擇,並且適用於為使用 tab 選項顯示使用者介面,因為其將 fragment 儲存在記憶體中,更易於管理控制層程式碼並且能夠增強應用的觸控體驗。

5.4 setOffscreenPageLimit (int)

用於定製預先載入相鄰頁面的數目,預先載入相鄰頁面的資料能夠使頁面的滑動顯示更為流暢,增強使用者體驗。