TabLayout+ViewPager+Fragment懶載入實現

摯愛你的人丶發表於2017-04-27

tablayout的使用


  1. TabLayout是在design下的包中,一般跟viewpager,fragment結合使用;
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.geek.viewpagerfragmentdemo.MainActivity">

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/tabLayout"
         />

    <android.support.design.widget.TabLayout
        android:background="@drawable/tablayout_bg"
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_alignParentBottom="true"
        app:tabIndicatorHeight="0dp"
        />

</RelativeLayout>
這裡預設設定indicator的高度為0來不顯示
  1. 但是在viewpager中用fragment存在著預載入機制,這個在一定的程度上很是麻煩,所以就使用懶載入機制來控制預載入模式,這裡重寫一個父類的BaseFragment來控制:
/**
 * fragment 基類
 */
public abstract class BaseFragment extends Fragment{
    protected boolean isInit = false;//檢視是否已經初初始化
    protected boolean isLoad = false;//是否載入
    protected final String TAG = "BaseFragment";
    private View view;//檢視

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(setContentView(), container, false);
        isInit = true;
        initData();
        /**初始化的時候去載入資料**/
        isCanLoadData();
        return view;
    }

    /**
     * 檢視是否可見
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        isCanLoadData();
    }

    /**
     * 是否可以載入資料
     */
    private void isCanLoadData() {
        if (!isInit) {
            return;
        }
        if (getUserVisibleHint()) {
            startLoad();
            isLoad = true;
        } else {
            if (isLoad) {
                stopLoad();
            }
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        isInit = false;
        isLoad = false;
    }

    protected View getContentView() {
        return view;
    }

    /**
     * findViewById
     */
    protected <T extends View> T findViewById(int id) {
        return (T) getContentView().findViewById(id);
    }

    protected abstract int setContentView();//顯示的佈局

    protected abstract void startLoad();//載入資料

    protected abstract void initData();//初始化資料

    /**
     * 當檢視不可見並且載入過資料,呼叫此方法
     */
    protected void stopLoad() {}

}

繼承這個父類,在startLoad方法中載入相對應的方法。

  1. 在activity中來呼叫,具體如下:
private void initTabLayout(){
        mFragment.clear();
        mTabLayout.removeAllTabs();
        mTabLayout.setTabMode(TabLayout.MODE_FIXED);//設定tab模式,當前為系統預設模式

        mFragment.add(new Fragment1());
        mFragment.add(new Fragment2());
        mFragment.add(new Fragment3());
        mAdapter = new MyFragmentAdapter(getSupportFragmentManager(),mFragment,mContext);
        mVp.setAdapter(mAdapter);
        mVp.setOffscreenPageLimit(2);
        //繫結ViewPager
        mTabLayout.setupWithViewPager(mVp);
        mVp.setCurrentItem(0);

        for (int i=0;i<mTabLayout.getTabCount();i++){
            TabLayout.Tab tab = mTabLayout.getTabAt(i);
            if (tab!=null){
                View v = mAdapter.getView(i);
                if (i==0){//預設第一個選中
                    v.setSelected(true);
                }
                tab.setCustomView(v);
            }
        }
        mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                mVp.setCurrentItem(tab.getPosition());
            }
            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }
            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

    }

重寫一個介面卡。來載入資料;

總的來說是可以解決預載入機制問題,

效果圖如下:


demo下載

相關文章