TabLayout+ViewPager+Fragment懶載入實現
阿新 • • 發佈:2019-02-14
tablayout的使用
- 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來不顯示
- 但是在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方法中載入相對應的方法。
- 在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) {
}
});
}
重寫一個介面卡。來載入資料;
總的來說是可以解決預載入機制問題,
效果圖如下: