Tablayout+Viewpager+Fragment組合使用以及懶載入機制
下面這個介面在日常開發中簡直太常見不過了,viewpager+fragment組合出來的效果!
- <android.support.design.widget.TabLayout
- android:id="@+id/tab_layout"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="#EF8D11"
- app:tabIndicatorColor="#EF4A11"
- app:tabMode="scrollable"
- app:tabSelectedTextColor="#FFFFFF"
- app:tabTextAppearance="@style/MyTabLayoutTextAppearance"
- app:tabTextColor="#FFFFFF" />
- <android.support.v4.view.ViewPager
- android:id="@+id/view_pager"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
屬性說明:android:background="#EF8D11"
背景色app:tabIndicatorColor="#EF4A11"
tab文字下方的那條線的顏色app:tabMode="scrollable"
如果tab過多超出螢幕寬度可以水平滾動app:tabSelectedTextColor="#FFFFFF"
tab被選中的時候文字的顏色app:tabTextColor="#FFFFFF"
tab未被選中時文字的顏色app:tabTextAppearance="@style/MyTabLayoutTextAppearance"
自定義字型大小(一般使用預設即可)
1 2 3 | <style name="MyTabLayoutTextAppearance" parent="TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse">
<item name="android:textSize">12sp</item>
</style>
|
java 程式碼
- private void initView(View view) {
- mTablayout = (TabLayout) view.findViewById(R.id.tab_layout);
- //mTablayout.setTabMode(TabLayout.MODE_SCROLLABLE);//擠在一起顯示
- viewpager = (ViewPager) view.findViewById(R.id.viewpager);
- setupViewPager(viewpager);
- mTablayout.addTab(mTablayout.newTab().setText("頭條"));
- mTablayout.addTab(mTablayout.newTab().setText("NBA"));
- mTablayout.addTab(mTablayout.newTab().setText("汽車"));
- mTablayout.addTab(mTablayout.newTab().setText("笑話"));
- mTablayout.setupWithViewPager(viewpager);
- }
- private void setupViewPager(ViewPager viewpager) {
- MyPagerAdapter adapter=new MyPagerAdapter(getChildFragmentManager());
- adapter.addFragment(FirstListFragment.newInstance(ONE),"頭條");
- adapter.addFragment(FirstListFragment.newInstance(TWO),"NBA");
- adapter.addFragment(FirstListFragment.newInstance(THREE),"汽車");
- adapter.addFragment(FirstListFragment.newInstance(FOUR),"笑話");
- viewpager.setAdapter(adapter);
- }
- public static class MyPagerAdapter extends FragmentPagerAdapter{
- private final List<Fragment> mFragment=new ArrayList<Fragment>();
- private final List<String> mFragmentTitle=new ArrayList<String>();
- public void addFragment(Fragment fragment,String title){
- mFragment.add(fragment);
- mFragmentTitle.add(title);
- }
- public MyPagerAdapter(FragmentManager fm) {
- super(fm);
- }
- @Override
- public Fragment getItem(int position) {
- return mFragment.get(position);
- }
- @Override
- public int getCount() {
- return mFragment.size();
- }
- @Override
- public CharSequence getPageTitle(int position) {
- return mFragmentTitle.get(position);
- }
- }
懶載入定義
Fragment的UI介面對使用者可見的時候才載入資料。
怎麼判斷什麼是否對使用者可見呢?
- public void setUserVisibleHint(boolean isVisibleToUser) {
- super.setUserVisibleHint(isVisibleToUser);
- if (getUserVisibleHint()) {
- //可見
- } else {
- //不可見
- }
- }
注意:fragment的緩載入,優先於oncreate方法執行,且每次切換fragment都會執行此方法!
程式碼
為了方便,封裝一個基類 LazyLoadFragment,提供一個 loadData() 方法供呼叫去載入資料
- public abstract class LazyLoadFragment extends Fragment {
- /**
- * 控制元件是否初始化完成
- */
- private boolean isViewCreated;
- /**
- * 資料是否已載入完畢
- */
- private boolean isLoadDataCompleted;
- @Nullable
- @Override
- public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
- View view = inflater.inflate(getLayout(), container, false);
- initViews(view);
- isViewCreated = true;
- return view;
- }
- public abstract int getLayout();
- public abstract void initViews(View view);
- @Override
- public void setUserVisibleHint(boolean isVisibleToUser) {
- super.setUserVisibleHint(isVisibleToUser);
- if (isVisibleToUser && isViewCreated && !isLoadDataCompleted) {
- isLoadDataCompleted = true;
- loadData();
- }
- }
- @Override
- public void onActivityCreated(@Nullable Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- if (getUserVisibleHint()) {
- isLoadDataCompleted = true;
- loadData();
- }
- }
- /**
- * 子類實現載入資料的方法
- */
- public abstract void loadData();
為什麼 loadData()
會在兩個地方執行?在 setUserVisibleHint 方法裡執行我還能理解,為什麼 onActivityCreated 也要執行呢?
因為,ViewPager 預設顯示第一頁,第一頁肯定要先載入資料,而且 setUserVisibleHint 的執行順序又是在 onCreatView 之前,同時 onCreatView 需要初始化介面和修改 isViewCreated 的值。所以就需要在 onActivityCreated 裡執行一次。
相關文章
- Android tabLayout+viewPager+fragment處理懶載入AndroidTabLayoutViewpagerFragment
- TabLayout+ViewPager+Fragment實現懶載入完全解決方案TabLayoutViewpagerFragment
- ABP - 模組載入機制
- Java基礎-類載入器以及載入機制Java
- Abp vNext 模組載入機制
- SAP CRM WebClient UI和Hybris Commerce的懶載入機制WebclientUI
- Hibernate 基本操作、懶載入以及快取快取
- Node.js常用模組Module的載入機制與使用Node.js
- jvm位元組碼和類載入機制JVM
- 懶載入
- 懶載入和預載入
- Ribbon - 懶載入
- Spring5.0原始碼學習系列之淺談懶載入機制原理Spring原始碼
- 程式碼分割與懶載入情況下(code-splitting+lazyload)抽離懶載入模組的公用模組程式碼
- 類載入機制
- Vue元件懶載入Vue元件
- 【譯】懶載入元件元件
- 圖片懶載入
- vue路由懶載入Vue路由
- Vue 的懶載入Vue
- Hibernate 之 懶載入
- Android 在 ViewPager 中使用 Fragment 的懶載入AndroidViewpagerFragment
- 圖片預載入和懶載入
- Vue 路由按需載入(路由懶載入)Vue路由
- JVM類載入機制JVM
- 類的載入機制
- JVM:類載入機制JVM
- java類載入機制Java
- 虛擬機器類載入機制:類載入時機虛擬機
- 前端效能優化 --- 懶載入&預載入前端優化
- 懶載入之intersection observerServer
- 圖片懶載入原理
- vue(18)路由懶載入Vue路由
- 圖片懶載入(IntersectionObserver)Server
- 關於懶載入原理
- Fragment 懶載入實踐Fragment
- Vue圖片懶載入之lazyload外掛使用Vue
- 手把手實現圖片懶載入+封裝vue懶載入元件封裝Vue元件