Tablayout+viewPager+懒加载快速实现一个导航模型

商城项目中使用最多的就是这个套路 - 各种订单列表,各种商品展示。每次布局的时候就想VC过来。所以就要频繁的去查找之前的写的代码,中间各种剔除逻辑。烦不胜烦。所以就 记录下大概模型。下次直接从博客拷贝。

Actvity类中的 xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <android.support.design.widget.TabLayout
            android:id="@+id/tl_tab"
            android:layout_width="match_parent"
            android:layout_height="@dimen/d48"
            android:background="@color/white"
            android:fillViewport="false"
            app:tabIndicatorColor="@color/E1251B"
            app:tabSelectedTextColor="@color/c333333"
            app:tabTextColor="@color/c666666">

        </android.support.design.widget.TabLayout>
        <View
            android:layout_width="match_parent"
            android:layout_height="@dimen/d1"
            android:layout_marginLeft="@dimen/d16"
            android:layout_marginRight="@dimen/d16"
            android:background="@color/cE6E6E6" />

        <android.support.v4.view.ViewPager
            android:id="@+id/vpFollowCompany"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    </LinearLayout>
</LinearLayout>

Activity 类 Java代码:

public class MineBargainActivity extends DBaseActivity {
    private TabLayout toolbar_tab;
    private ViewPager vpFollowCompany;
    private MineBargainFragment mPosterFragment;//全部
    private List<Fragment> fragmentList;
    private int index = 0;

    @Override
    public void initTitle() {
        getDTitle().createTitle(R.mipmap.ic_back, "砍价订单", "")
                .setBgColor(R.color.cffffff)
                .setSpaceLineIsVisbale(View.VISIBLE)
                .setLeftClickListener(new DTitle.LeftClickListener() {
                    @Override
                    public void onClick() {
                        MineBargainActivity.this.finish();
                    }
                });
    }

    @Override
    public int res() {
        return R.layout.activity_bargain;
    }

    @Override
    public void initView() {
        index = getIntent().getIntExtra("index", 0);
        toolbar_tab = (TabLayout) findViewById(R.id.tl_tab);
        vpFollowCompany = (ViewPager) findViewById(R.id.vpFollowCompany);

    }

    @Override
    public void initData() {
        initFragments();
        vpFollowCompany.setCurrentItem(index);
    }

    @Override
    public void httpSuccess(String url, ResultBean data) {

    }

    @Override
    public void httpError(int code, String url) {

    }


    public void initFragments() {
        List<String> mList = new ArrayList<>();
        fragmentList = new ArrayList<>();
        mList.add("全部");
        mList.add("待成单");
        mList.add("待发货");
        mList.add("待收货");
        mList.add("完成");
        for (int x = 0; x < mList.size(); x++) {
            TabLayout.Tab tab1 = toolbar_tab.newTab().setText(mList.get(x));
            mPosterFragment = MineBargainFragment.getInstance(String.valueOf(x));//待发货
            fragmentList.add(mPosterFragment);
            toolbar_tab.addTab(tab1);
        }
        PagerAdapter mPagerAdapter = new PagerAdapter(getSupportFragmentManager());
        vpFollowCompany.setAdapter(mPagerAdapter);
        vpFollowCompany.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(toolbar_tab));
        toolbar_tab.setOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(vpFollowCompany));
    }

    public class PagerAdapter extends FragmentPagerAdapter {
        public PagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return fragmentList.get(position);
        }

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

    }

}

其中DBaseActivity 是抽的基类,封装一下网络的处理,方法的封装,不需要关系

Framgent 继承 BaseLazyFragment 做统一的懒加载处理

public abstract  class BaseLazyFragment extends DBaseFragment {
    /**
     * 懒加载过
     */
    protected boolean isLazyLoaded = false;
    /**
     * Fragment的View加载完毕的标记
     */
    private boolean isPrepared = false;

    /**
     * 第一步,改变isPrepared标记
     * 当onViewCreated()方法执行时,表明View已经加载完毕,此时改变isPrepared标记为true,并调用lazyLoad()方法
     */
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        isPrepared = true;
        //只有Fragment onCreateView好了
        //另外这里调用一次lazyLoad()
        lazyLoad();
    }



    /**
     * 第二步
     * 此方法会在onCreateView()之前执行
     * 当viewPager中fragment改变可见状态时也会调用
     * 当fragment 从可见到不见,或者从不可见切换到可见,都会调用此方法
     * true表示当前页面可见,false表示不可见
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        //只有当fragment可见时,才进行加载数据
        if (isVisibleToUser){
            lazyLoad();
        }
    }




    /**
     * 调用懒加载
     * 第三步:在lazyLoad()方法中进行双重标记判断,通过后即可进行数据加载
     */
    private void lazyLoad() {
        if (getUserVisibleHint() && isPrepared && !isLazyLoaded) {
            showFirstLoading();
            onLazyLoad();
            isLazyLoaded = true;
        } else {
            //当视图已经对用户不可见并且加载过数据,如果需要在切换到其他页面时停止加载数据,可以覆写此方法
            if (isLazyLoaded) {
                stopLoad();
            }
        }
    }


    /**
     * 视图销毁的时候讲Fragment是否初始化的状态变为false
     */
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        isLazyLoaded = false;
        isPrepared = false;
    }

    /**
     * 第一次可见时,操作该方法,可以用于showLoading操作,注意这个是全局加载loading
     */
    protected void showFirstLoading() {
    }

    /**
     * 停止加载
     * 当视图已经对用户不可见并且加载过数据,但是没有加载完,而只是加载loading。
     * 如果需要在切换到其他页面时停止加载数据,可以覆写此方法。
     * 存在问题,如何停止加载网络
     */
    protected void stopLoad(){

    }

    /**
     * 第四步:定义抽象方法onLazyLoad(),具体加载数据的工作,交给子类去完成
     */
    @UiThread
    protected abstract void onLazyLoad();

}

同样DBaseFragment 不需要关心。

 

OK,结束。下一篇不知道啥时候开始写了,主要是第一个版本还没有上线 ,第二个版本已经给画饼了。

 

 

 

展开阅读全文
©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值