1. 程式人生 > >Android-ViewPagerIndicator自定義tab數量

Android-ViewPagerIndicator自定義tab數量

檢視TabPageIndicator的原始碼我們可以看到有一個notifyDataSetChanged()方法。
public void notifyDataSetChanged() {
        mTabLayout.removeAllViews();
        PagerAdapter adapter = mViewPager.getAdapter();
        IconPagerAdapter iconAdapter = null;
        if (adapter instanceof IconPagerAdapter) {
            iconAdapter = (IconPagerAdapter)adapter;
        }
        final int count = adapter.getCount();
        for (int i = 0; i < count; i++) {
            CharSequence title = adapter.getPageTitle(i);
            if (title == null) {
                title = EMPTY_TITLE;
            }
            int iconResId = 0;
            if (iconAdapter != null) {
                iconResId = iconAdapter.getIconResId(i);
            }
            addTab(i, title, iconResId);
        }
        if (mSelectedTabIndex > count) {
            mSelectedTabIndex = count - 1;
        }
        setCurrentItem(mSelectedTabIndex);
        requestLayout();
    }

我們理解一下:

mTabLayout.removeAllViews();

mTabLayout是什麼?

mTabLayout是IcsLinearLayout型別的,IcsLinearLayout是什麼東西?

察看原始碼就很容易看出來,IcsLinearLayout其實是放tab的容器,繼承LinearLayout,tab都放在這裡面展示。裡面封裝了tab的樣式:字型大小,顏色,間隔,分割線的樣式等等。不是很難就不介紹了。

notifyDataSetChanged的第一行就是mTabLayout.removeAllViews();清空所有的tab。

繼續看程式碼,PagerAdapter adapter = mViewPager.getAdapter();獲取了mViewPager

的介面卡,這個介面卡我們一般都是關聯著一個fragment的列表。

繼續

for (int i = 0; i < count; i++) {

            CharSequence title =adapter.getPageTitle(i);

            if (title == null) {

                title = EMPTY_TITLE;

            }

            int iconResId = 0;

            if (iconAdapter != null) {

                iconResId =iconAdapter.getIconResId(i);

            }

            addTab(i, title, iconResId);

        }

會將介面卡中的每個item都拿出來構建一個tab加入到mTabLayout中。

最後重新整理頁面。

主體思路:清空所有的tab,重新載入tab,到了這裡我們就知道怎麼實現類似網易新聞tab的功能了吧 。