怎樣抽取一個“滑動標題欄+ViewPager”梧疲?

怎樣抽取一個“滑動標題欄+ViewPager”允睹?

前段時間遇到一個需求:滑動標題欄+可滑動的viewpager展示頁面數(shù)據(jù)运准,然后到github上找了一圈,發(fā)現(xiàn)這個作者寫的工程還是蠻好用的LuckyJayce/ViewPagerIndicator,效果如圖:

pic1
pic1

  • 為什么要抽取這個東西呢缭受?
    因為想要下次遇到的時候直接使用胁澳,不要到git上去查找,然后添加米者,提高開發(fā)效率韭畸。
  • 如何抽取"滑動標題欄+ViewPager"?
    • 第一步,我們需要下載這個作者的Example蔓搞,然后運行跑起來胰丁,下載地址:demo
    • 第二步,抽取我們依賴的java代碼到我們的Lib庫里喂分,將ColorBar锦庸、ScrollBar、OnTransitionTextListener蒲祈、FixIndicatorView甘萧、FragmentListPagerAdapter、Indicator梆掸、IndicatorViewPager扬卷、ScrollIndicaotorView、ColorGradient沥潭、RecycleBin邀泉、RecyclingPagerAdapter、SViewPager抽取到我們的Lib庫
    • 第三步钝鸽,現(xiàn)繪制界面汇恤,fragment_scroll_viewpager.xml如:
      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">
          <lib.view.indicator.ScrollIndicatorView
              android:id="@+id/moretab_indicator"
              android:layout_width="match_parent"
              android:layout_height="45dp" />
          <android.support.v4.view.ViewPager
              android:id="@+id/moretab_viewPager"
              android:layout_width="match_parent"
              android:layout_height="match_parent" />
      </LinearLayout>
      
    • 第四步,定義一個ScrollViewpagerBaseFragment繼承自BaseFragment拔恰,先初始化界面的所有控件,如:
      @Bind(B.id.moretab_indicator)
      ScrollIndicatorView scrollIndicatorView;
      @Bind(B.id.moretab_viewPager)
      ViewPager viewPager;
      @Override
      public int getLayoutId() {
          return R.layout.fragment_scroll_viewpager;
      }
      
    • 第五步因谎,因為這個界面的展示需要的數(shù)據(jù)有標題和子Fragment,所以有兩個方法特別重要颜懊,如:
      public abstract BaseFragment[] getChildFragments();
      public abstract String[] getChildTitles();
      
      因為是抽象的财岔,所以我們定義的這個ScrollViewpagerBaseFramgnt也是一個抽象類,這樣你自定義一個fragment繼承自ScrollViewPagerBaseFragment,就必須重寫這兩個方法河爹。
    • 第六步匠璧,在onCreaview中調用getChildFragments()和getChildTitles(),賦值給這個類中的fragmentList和titles。
    @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       View rootView=super.onCreateView(inflater, container, savedInstanceState);
       fragmentList=getChildFragments();
       titles=getChildTitles();
       Log.i(TAG,titles.toString());
       Log.i(TAG,fragmentList.toString());
       initScrollViewPager(titles,fragmentList);
       return rootView;
   }
    ```
  * 第七步咸这,初始化標題欄和Viewpager的適配器
    ```java
    //fragment的適配器
    private class MyAdapter extends IndicatorViewPager.IndicatorFragmentPagerAdapter {

        public MyAdapter(FragmentManager fragmentManager) {
            super(fragmentManager);
        }

        @Override
        public int getCount() {
            return fragmentList.length;
        }

        @Override
        public View getViewForTab(int position, View convertView, ViewGroup container) {
            if (convertView == null) {
                convertView = getActivity().getLayoutInflater().inflate(R.layout.tab_top, container, false);
            }
            TextView textView = (TextView) convertView;
            textView.setText(titles[position]);

            int witdh = getTextWidth(textView);
//            int padding = DisplayUtil.dipToPix(getContext(), 8);
            //因為wrap的布局 字體大小變化會導致textView大小變化產生抖動夷恍,這里通過設置textView寬度就避免抖動現(xiàn)象
            //1.3f是根據(jù)上面字體大小變化的倍數(shù)1.3f設置
            textView.setWidth((int) (witdh * 1.13f) + 0);
            return convertView;
        }

        @Override
        public Fragment getFragmentForPage(int position) {
            return fragmentList[position];
        }

        private int getTextWidth(TextView textView) {
            if (textView == null) {
                return 0;
            }
            Rect bounds = new Rect();
            String text = textView.getText().toString();
            Paint paint = textView.getPaint();
            paint.getTextBounds(text, 0, text.length(), bounds);
            int width = bounds.left + bounds.width();
            return width;
        }

    }
    //設置數(shù)據(jù)源
    public void initScrollViewPager(String[] titles,BaseFragment[] fragmentList){
          scrollIndicatorView.setOnTransitionListener(new OnTransitionTextListener().setColor(0xFF2196F3, Color.GRAY).setSize(selectSize, unSelectSize));
  
          scrollIndicatorView.setScrollBar(new ColorBar(getContext(), 0xFF2196F3, 4));
  
          viewPager.setOffscreenPageLimit(2);
          indicatorViewPager = new IndicatorViewPager(scrollIndicatorView, viewPager);
          indicatorViewPager.setAdapter(new MyAdapter(getActivity().getSupportFragmentManager()));
          indicatorViewPager.setCurrentItem(0, true);
      }
    ```

* 如何使用抽取的“滑動標題欄+ViewPager”?  
  直接自定義一個TestFragment繼承自ScrollViewpagerBaseFragment媳维,然后系統(tǒng)會提示你去重寫ScrollViewpagerBaseFragment的抽象方法酿雪,然后初始化數(shù)據(jù)遏暴,并將初始化的數(shù)據(jù)賦值給這兩個方法,就可以使用"滑動標題欄+ViewPager"了指黎。
```java
  public class TestFragment extends ScrollViewpagerBaseFragment{
    private BaseFragment[] childsFragment = {new DeviceInfoFragment(), new DeviceInfoFragment(), new DeviceInfoFragment(), new DeviceInfoFragment(), new DeviceInfoFragment()};
    private String[] childTitle = {"title1","title2","title3","title4","title5"};
    @Override
    public BaseFragment[] getChildFragments() {
        return childsFragment;
    }

    @Override
    public String[] getChildTitles() {
        return childTitle;
    }
}

希望能幫到你朋凉!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市醋安,隨后出現(xiàn)的幾起案子杂彭,更是在濱河造成了極大的恐慌,老刑警劉巖吓揪,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盖灸,死亡現(xiàn)場離奇詭異,居然都是意外死亡磺芭,警方通過查閱死者的電腦和手機赁炎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钾腺,“玉大人徙垫,你說我怎么就攤上這事》虐簦” “怎么了姻报?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長间螟。 經常有香客問我吴旋,道長,這世上最難降的妖魔是什么厢破? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任荣瑟,我火速辦了婚禮,結果婚禮上摩泪,老公的妹妹穿的比我還像新娘笆焰。我一直安慰自己,他們只是感情好见坑,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布嚷掠。 她就那樣靜靜地躺著,像睡著了一般荞驴。 火紅的嫁衣襯著肌膚如雪不皆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天熊楼,我揣著相機與錄音霹娄,去河邊找鬼。 笑死,一個胖子當著我的面吹牛项棠,可吹牛的內容都是我干的。 我是一名探鬼主播挎峦,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼香追,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坦胶?” 一聲冷哼從身側響起透典,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎顿苇,沒想到半個月后峭咒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡纪岁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年凑队,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幔翰。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡漩氨,死狀恐怖,靈堂內的尸體忽然破棺而出遗增,到底是詐尸還是另有隱情叫惊,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布做修,位于F島的核電站霍狰,受9級特大地震影響,放射性物質發(fā)生泄漏饰及。R本人自食惡果不足惜蔗坯,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望燎含。 院中可真熱鬧步悠,春花似錦、人聲如沸瘫镇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铣除。三九已至谚咬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尚粘,已是汗流浹背择卦。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秉继。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓祈噪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尚辑。 傳聞我的和親對象是個殘疾皇子辑鲤,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評論 25 707
  • ViewPager在開發(fā)中的使用頻率非常的高,所以在此做個總結杠茬。主要包括以下幾方面: ViewPager的簡介和作...
    西瓜太郎123閱讀 120,851評論 21 261
  • 仿照著知乎寫了一套UI界面月褥,結合著以前學的知識,一天就擼了出來瓢喉,其實也沒啥東西宁赤,就是有些沒接觸的地方踩了坑。 效果...
    hongjay閱讀 11,177評論 17 117
  • 入住歐洲的酒店栓票,發(fā)現(xiàn)决左,這里大都位于市郊,有些偏遠走贪,也更靜謐哆窿。酒店周圍都被綠樹環(huán)繞,我現(xiàn)在天天早晨厉斟,是被小鳥叫醒挚躯,而...
    陽光心理師于化化閱讀 108評論 0 0
  • 我們是不是在哪兒見過? 聽到這句話擦秽,我們通常能聯(lián)想到這樣一個場景:一個男孩身旁走過一個漂亮姑娘码荔,男孩想借機搭訕,便...
    夏冬陽閱讀 538評論 3 1