ViewPager+RecyclerView分頁菜單欄

原文鏈接:http://www.reibang.com/p/f3dd827147db

分頁菜單圖

想做一個如上圖的橫向分頁菜單欄寨昙,最先在網(wǎng)上找了一圈页屠,看到這個使用RecyclerView實現(xiàn)多行水平分頁的GridView效果和ViewPager效果還不錯竞滓,但感覺要自定義四個文件搅吁,要復制一大堆蝗拿,我懶额港,所以就沒怎么仔細看它的分頁自定義了御铃。所以我打算還是用ViewPager來分頁吧碴里,每頁用一個RecyclerView來裝載固定的數(shù)據(jù)就可以了。

1.布局:
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <android.support.v4.view.ViewPager
                    android:id="@+id/view_pager"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />

                <net.lucode.hackware.magicindicator.MagicIndicator
                    android:id="@+id/tab_layout"
                    android:layout_width="66dp"
                    android:layout_height="8dp"
                    android:layout_gravity="center"
                    android:background="@drawable/round_orange_rim_white_bg" />

            </LinearLayout>

其中用到了MagicIndicator這款指示器上真,可以自定義非常靈活咬腋,盡管我懶得自定義。

2.初始化ViewPager
public class CoordinatorLayoutTestFragment extends BaseFragment {
    @BindView(R.id.view_pager)
    ViewPager viewPager;
    @BindView(R.id.magic_indicator)
    MagicIndicator magicIndicator;
    @Override
    public int setLayout() {
        return R.layout.fragment_coordinatorlayout_test;
    }
    @Override
    protected void onBindView(View view, ViewGroup container, Bundle savedInstanceState) {
        initViewPager(getData(), 2, 4);
    }
    /**
     * @param datas   所有數(shù)據(jù)
     * @param rowNum  行數(shù)
     * @param spanNum 列數(shù)
     */
    private void initViewPager(ArrayList<MenuItem> datas, int rowNum, int spanNum) {
        //1.根據(jù)數(shù)據(jù)的多少來分頁睡互,每頁的數(shù)據(jù)為rw
        int singlePageDatasNum = rowNum * spanNum;//每個單頁包含的數(shù)據(jù)量:2*4=8根竿;
        int pageNum = datas.size() / singlePageDatasNum;//算出有幾頁菜單:20%8 = 3;
        if (datas.size() % singlePageDatasNum > 0) pageNum++;//如果取模大于0,就還要多一頁出來就珠,放剩下的不滿項
        ArrayList<RecyclerView> mList = new ArrayList<>();
        for (int i = 0; i < pageNum; i++) {
            RecyclerView recyclerView = new RecyclerView(_mActivity);
            GridLayoutManager gridLayoutManager = new GridLayoutManager(_mActivity, spanNum);
            recyclerView.setLayoutManager(gridLayoutManager);
            int fromIndex = i * singlePageDatasNum;
            int toIndex = (i + 1) * singlePageDatasNum;
            if (toIndex > datas.size()) toIndex = datas.size();
            //a.截取每個頁面包含數(shù)據(jù)
            ArrayList<MenuItem> menuItems = new ArrayList<>(datas.subList(fromIndex, toIndex));
            //b.設置每個頁面的適配器數(shù)據(jù)
            MainMenuAdapter menuAdapter = new MainMenuAdapter();
            menuAdapter.setNewData(menuItems);
            //c.綁定適配器寇壳,并添加到list
            menuAdapter.bindToRecyclerView(recyclerView);
            recyclerView.setAdapter(menuAdapter);
            mList.add(recyclerView);
        }
        //2.ViewPager的適配器
        MenuViewPagerAdapter menuViewPagerAdapter = new MenuViewPagerAdapter(mList);
        viewPager.setAdapter(menuViewPagerAdapter);
        //3.動態(tài)設置ViewPager的高度,并加載所有頁面
        int height = DpPxUtils.dp2px(80);//這里的80為MainMenuAdapter中布局文件高度
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, datas.size()<=spanNum?height:height * rowNum);
        viewPager.setLayoutParams(layoutParams);
        viewPager.setOffscreenPageLimit(pageNum - 1);
        //4.創(chuàng)建指示器
        CommonNavigator commonNavigator = new CommonNavigator(_mActivity);
        commonNavigator.setAdjustMode(true);
        int finalPageNum = pageNum;
        commonNavigator.setAdapter(new CommonNavigatorAdapter() {
            @Override
            public int getCount() {
                return finalPageNum;
            }

            @Override
            public IPagerTitleView getTitleView(Context context, int index) {
                return new DummyPagerTitleView(context);
            }

            @Override
            public IPagerIndicator getIndicator(Context context) {
                LinePagerIndicator indicator = new LinePagerIndicator(context);
                indicator.setMode(LinePagerIndicator.MODE_EXACTLY);
                indicator.setLineHeight(UIUtil.dip2px(context, 8));//就是指示器的高
                indicator.setLineWidth(UIUtil.dip2px(context, 66/finalPageNum));//就是指示器的寬度妻怎,然后通過頁數(shù)來評分
                indicator.setRoundRadius(UIUtil.dip2px(context, 8));
                indicator.setStartInterpolator(new AccelerateInterpolator());
                indicator.setEndInterpolator(new DecelerateInterpolator(3));
                indicator.setColors(ContextCompat.getColor(context,R.color.colorAccent));
                return indicator;
            }
        });
        //5.配置指示器壳炎,并和ViewPager產(chǎn)生綁定
        magicIndicator.setNavigator(commonNavigator);
        ViewPagerHelper.bind(magicIndicator, viewPager);
    }
    private ArrayList<MenuItem> getData() {
        ArrayList<MenuItem> list = new ArrayList<>();
        for (int i = 0; i < 22; i++) {
            list.add(new MenuItem(R.mipmap.ic_launcher_round, "SmallCake" + (i+1)));
        }
        return list;
    }
}

其中的MenuItem就是菜單的類,每個人不同逼侦,自己寫吧匿辩。關鍵點就是根據(jù)行數(shù)和列數(shù)得到每頁總數(shù),然后根據(jù)數(shù)據(jù)量的數(shù)目算出有好多頁就行了榛丢。
還有ViewPager的分頁適配器為:MenuViewPagerAdapter:

public class MenuViewPagerAdapter extends PagerAdapter {
    private ArrayList<RecyclerView> mList;
    public MenuViewPagerAdapter(ArrayList<RecyclerView> mList) {
        this.mList = mList;
    }
    @Override
    public int getCount() {
        return mList.isEmpty() ? 0 : mList.size();
    }
    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
        return view==o;
    }
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView(mList.get(position));
    }
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        container.addView(mList.get(position));
        return mList.get(position);
    }
}

感覺比自定義簡單铲球,最后的效果就出來了:


分頁菜單
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市晰赞,隨后出現(xiàn)的幾起案子稼病,更是在濱河造成了極大的恐慌,老刑警劉巖宾肺,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溯饵,死亡現(xiàn)場離奇詭異,居然都是意外死亡锨用,警方通過查閱死者的電腦和手機丰刊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來增拥,“玉大人啄巧,你說我怎么就攤上這事寻歧。” “怎么了秩仆?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵码泛,是天一觀的道長。 經(jīng)常有香客問我澄耍,道長噪珊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任齐莲,我火速辦了婚禮痢站,結果婚禮上,老公的妹妹穿的比我還像新娘选酗。我一直安慰自己阵难,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布芒填。 她就那樣靜靜地躺著呜叫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪殿衰。 梳的紋絲不亂的頭發(fā)上朱庆,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音播玖,去河邊找鬼椎工。 笑死,一個胖子當著我的面吹牛蜀踏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掰吕,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼果覆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了殖熟?” 一聲冷哼從身側響起局待,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菱属,沒想到半個月后钳榨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡纽门,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年薛耻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赏陵。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡饼齿,死狀恐怖饲漾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缕溉,我是刑警寧澤考传,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站证鸥,受9級特大地震影響僚楞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枉层,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一泉褐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧返干,春花似錦兴枯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至癌淮,卻和暖如春躺坟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乳蓄。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工咪橙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虚倒。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓美侦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親魂奥。 傳聞我的和親對象是個殘疾皇子菠剩,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345