TabLayout+ViewPager+Fragment懒加载实现

tablayout的使用


  1. TabLayout是在design下的包中,一般跟viewpager,fragment结合使用;

<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 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;iif (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) {

            }
        });

    }

重写一个适配器。来加载数据;

总的来说是可以解决预加载机制问题,

效果图如下:

TabLayout+ViewPager+Fragment懒加载实现_第1张图片


demo下载

你可能感兴趣的:(android)