TabLayout+ViewPager 懶載入

真的很疼發表於2017-02-09

懶載入框架使用網上開源的:https://github.com/lianghanzhen/LazyViewPager

先看佈局

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

    <include layout="@layout/base_title" />

    <android.support.design.widget.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="100px" />

    <com.wzb.bd2xl.widget.LazyViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

activity中的程式碼

public class XunLeiManager extends BaseActivity {

    @BindView(R.id.viewpager)
    LazyViewPager viewpager;
    @BindView(R.id.tabLayout)
    TabLayout tabLayout;
    private List<String> titles;

    @Override
    public void initData() {


    }

    @Override
    public int getLayoutID() {
        return R.layout.activity_xunleimanager;
    }

    @Override
    public void initView() {
        tabLayout.setTabMode(TabLayout.MODE_FIXED);
        titles = Arrays.asList(getResources().getStringArray(R.array.xunlei_mamager));
        PagerAdapter xunLeiManagerPagerAdapter = new XunleiFragmentAdapter(getSupportFragmentManager(), titles);
        viewpager.setAdapter(xunLeiManagerPagerAdapter);
        tabLayout.setupWithViewPager(viewpager);


    }


}

執行起來效果
此時滑動起來確實是懶載入.點選 正在載入 已完成 垃圾箱 確實都沒重複載入
但是 重新執行程式起來,
此時先點選提交失敗 發現日誌 列印 把已完成 垃圾箱 功能模組中的onCreateView方法的日誌列印出來了,我當前需要的是當點選對應的功能之後才執行onCreateView方法,應為我的資料初始化是放在onCreateView裡面.而初始化資料可能會涉及到訪問網路,當使用者未點選該模組卻去訪問網路肯定不行.

那此時 檢視tabLayout的點選事件:


 public static class ViewPagerOnTabSelectedListener implements TabLayout.OnTabSelectedListener {
        private final ViewPager mViewPager;

        public ViewPagerOnTabSelectedListener(ViewPager viewPager) {
            mViewPager = viewPager;
        }

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            mViewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            // No-op
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
            // No-op
        }
    }

mViewPager.setCurrentItem(tab.getPosition());
在呼叫該方法的時候 假設 有 A,B,C,D四個Fragment 我初始化選中 A 然後設定currentItem為D的時候 也會對BC進行onCreateView進行呼叫.

猜測是在平滑過渡效果的時候快速的顯示了 BC兩個頁面..
解決辦法
直接重寫:setOnTabSelectedListener方法得到覺得
只是在從A點到D的時候就底部綠色條是一閃到D的底部 而不是滑動了

tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {



                    viewpager.setCurrentItem(tab.getPosition(),false);



                }

                @Override
                public void onTabUnselected(TabLayout.Tab tab) {

                }

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

                }
            });

相關文章