使用LazyViewPager,实现完整的懒加载ViewPager

功能:利用懒加载类LazyViewPager实现完整的不预加载ViewPager,同时在类中添加一个函数用于控制是否支持横向滑动切换ViewPager(适用于有些fragment包含可左滑删除的列表,禁用左右切换ViewPage方可实现左滑删除功能,防止滑动事件冲突)。

以下主要讲的是Acitvity中如何利用LazyViewPager类实现懒加载ViewPager,可以点击tab切换或者滑动切换page。

涉及主要类:MainActivity,LazyViewPager;主要布局文件:activity_main。

在模块的build.gradle添加依赖

    //noinspection GradleCompatible
    implementation 'com.android.support:support-v4:27.1.1'
    //noinspection GradleCompatible
    implementation 'com.android.support:appcompat-v7:27.1.1'
    //noinspection GradleCompatible
    implementation 'com.android.support:design:27.1.1'

activity_main.xml

<!-- add by zzh 20180802 for live interaction activity, contain live send message , live host and audience interaction, game record-->
<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"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.design.widget.TabLayout
            android:id="@+id/anchor_home_tablayout"
            android:layout_width="match_parent"
            android:layout_height="30dp"
            app:tabIndicatorHeight="2dp"
            app:tabIndicatorColor="@android:color/holo_red_dark"
            app:tabSelectedTextColor="@android:color/holo_blue_light"
            app:tabGravity="fill"
            app:tabMode="fixed" />
    </LinearLayout>
    <!-- 注意此处的包名根据具体而定 -->
    <com.zzh.lazyloadviewpager.LazyViewPager
        android:id="@+id/anchor_viewpage"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>
MainActivity.java
// import ...
/**
 * created by zzh 20180802 for anchor image text publish, anchor interaction with audience, game record fragment
 */
public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    // view
    private TabLayout mAnchorTabLayout;
    private LazyViewPager mAnchorViewPager;
    // adapter
    TabFrgAdapter mViewPagerAdapter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initViewPagerAdapter(getAnchorFragmentList(), addAnchorTab());
    }

    private void initView() {
        mAnchorTabLayout = (TabLayout) findViewById(R.id.anchor_home_tablayout);
        mAnchorViewPager = (LazyViewPager) findViewById(R.id.anchor_viewpage);
        mAnchorViewPager.setOnPageChangeListener(mViewPagerChangeListener);
    }

    private ArrayList<String> addAnchorTab() {
        ArrayList<String> tabTitleArray = new ArrayList<String>();
        tabTitleArray.add(0, "Tab1");
        tabTitleArray.add(1, "Tab2");
        tabTitleArray.add(2, "Tab3");
        if (mAnchorTabLayout != null) {
            mAnchorTabLayout.addTab(mAnchorTabLayout.newTab().setText(tabTitleArray.get(0)));
            mAnchorTabLayout.addTab(mAnchorTabLayout.newTab().setText(tabTitleArray.get(1)));
            mAnchorTabLayout.addTab(mAnchorTabLayout.newTab().setText(tabTitleArray.get(2)));
        }
        return tabTitleArray;
    }

    @SuppressLint("LongLogTag")
    private ArrayList<Fragment> getAnchorFragmentList() {
        ArrayList<Fragment> fragmentsArray = new ArrayList<Fragment>();
        fragmentsArray.add(0, new FirstFragment());
        fragmentsArray.add(1, new SecondFragment());
        fragmentsArray.add(2, new ThirdFragment());
        Log.i(TAG, "test log:getAnchorFragmentList");
        return fragmentsArray;
    }

    private void initViewPagerAdapter(ArrayList<Fragment> fragments, ArrayList<String> tabTitles) {
        mViewPagerAdapter = new TabFrgAdapter(getSupportFragmentManager(), fragments, tabTitles);

        // set view pager adapter
        if (mAnchorViewPager != null) {
            mAnchorViewPager.setAdapter(mViewPagerAdapter);
            // connect tablayout and viewpager
            //mAnchorTabLayout.setupWithViewPager(mAnchorViewPager);
        }

        // make click tab view item to make view pager to scroll to relevant position
        for (int i = 0; i < mAnchorTabLayout.getTabCount(); i++) {
            TabLayout.Tab tab = mAnchorTabLayout.getTabAt(i);
            if (tab != null) {
                // use reflect to get tab object, then to get Class
                Class c = tab.getClass();
                try {
                    // c.getDeclaredField get private attribute
                    // view is tab's private attribute, type is TabView, TabLayout private inner class
                    // if dependence com.android.support:design:28.0.0 use "view", if below this version, then the field name is mView
                    Field field = c.getDeclaredField("mView");
                    if (field == null) {
                        continue;
                    }
                    field.setAccessible(true);
                    final View view = (View) field.get(tab);
                    if (view == null) {
                        continue;
                    }
                    view.setTag(i);
                    view.setOnClickListener(mTabOnClickListener);
                } catch (NoSuchFieldException e) {
                    Log.e(TAG, "NoSuchFieldException, message="+e.getMessage());
                } catch (IllegalAccessException e) {
                    Log.e(TAG, "IllegalAccessException, message="+e.getMessage());
                } catch (Exception e) {
                    Log.e(TAG, "Exception, message="+e.getMessage());
                }
            }
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    // make tab layout scroll to correct position tab when viewpager scroll
    LazyViewPager.OnPageChangeListener mViewPagerChangeListener = new LazyViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            mAnchorTabLayout.getTabAt(position).select();
        }

        @Override
        public void onPageSelected(int position) {
            mAnchorTabLayout.getTabAt(position).select();
        }

        @Override
        public void onPageScrollStateChanged(int state) {
            /* this function called when state is changed, state has 3 state:0, 1, 2
                state ==1 : page is scrolling
                state==2 : page is scroll finish
                state==0 : page do nothing */
        }
    };

    // make viewpager to relevant position when user click tablayout tab
    private View.OnClickListener mTabOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int pos = (int) view.getTag();
            TabLayout.Tab tab = mAnchorTabLayout.getTabAt(pos);
            if (tab != null) {
                tab.select();
            }
            mAnchorViewPager.setCurrentItem(pos, false);
        }
    };
}

 完整代码工程见我的资源:https://download.csdn.net/download/zzhceo/10741960

猜你喜欢

转载自blog.csdn.net/zzhceo/article/details/83347438