zoukankan      html  css  js  c++  java
  • 【 Android 】ViewPager + TabLayout + Fragment 数据初始化问题

    ViewPager Fragment 配合使用的时候,ViewPager 会使用预加载机制,使得我们在没有切换到到对应页面时,就已经加载好了,这是个非常不好的用户体验。

    所以本示例项目就诞生了。

    关键字:setUserVisibleHint

    实例:

    示例结构:
    使用Activity嵌套Fragment

    MainActivity

    public class MainActivity extends AppCompatActivity {
    
        private ArrayList<Fragment> mFragments;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            initFragment();
    
            initView();
        }
    
        private void initFragment() {
            mFragments = new ArrayList<>();
    
            AFragment aFragment = AFragment.newInstance();
            BFragment bFragment = BFragment.newInstance();
            CFragment cFragment = CFragment.newInstance();
    
            mFragments.add(aFragment);
            mFragments.add(bFragment);
            mFragments.add(cFragment);
        }
    
        private void initView() {
            final TabLayout tabLayout = findViewById(R.id.tab_layout);
            final ViewPager viewPager = findViewById(R.id.viewpager);
    
            viewPager.setAdapter(new FragmentStatePagerAdapter(getSupportFragmentManager()) {
                @Override
                public Fragment getItem(int position) {
                    return mFragments.get(position);
                }
    
                @Override
                public int getCount() {
                    return mFragments.size();
                }
            });
    
            viewPager.setOffscreenPageLimit(mFragments.size());
    
            viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    
            tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
                    Log.d(TAG, "onTabSelected: ");
    
                    viewPager.setCurrentItem(tabLayout.getSelectedTabPosition(), true);
                }
    
                @Override
                public void onTabUnselected(TabLayout.Tab tab) {
                    Log.d(TAG, "onTabUnselected: ");
                }
    
                @Override
                public void onTabReselected(TabLayout.Tab tab) {
                    Log.d(TAG, "onTabReselected: ");
                }
            });
        }
    }

    AFragment 

    public class AFragment extends Fragment {
    
        public AFragment() {
            // Requires empty public constructor
        }
    
        public static AFragment newInstance() {
            return new AFragment();
        }
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater,
                                 @Nullable ViewGroup container,
                                 @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_a, container, false);
    
            initView(view);
    
            return view;
        }
    
        private void initView(View view) {
            
        }
    }

    BFragment

    public class BFragment extends Fragment {
    
        private boolean isFirst = true;
    
        public BFragment() {
            // Requires empty public constructor
        }
    
        public static BFragment newInstance() {
            return new BFragment();
        }
    
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater,
                                 @Nullable ViewGroup container,
                                 @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_b, container, false);
    
            initView(view);
    
            return view;
        }
    
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
    
            if (isVisibleToUser && isFirst) {
                Log.d(TAG, "BFragment 首次加载");
    
                isFirst = false;
            }
        }
    
        private void initView(View view) {
            
        }
    }

    CFragmentBFragment相似,就不赘述了。

    MainActivity对应的布局文件

    <?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"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".ui.activity.MainActivity">
    
        <android.support.design.widget.TabLayout
            android:id="@+id/tab_layout"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            app:tabMode="scrollable"
            app:tabSelectedTextColor="@color/colorAccent">
    
            <android.support.design.widget.TabItem
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="A" />
    
            <android.support.design.widget.TabItem
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="B" />
    
            <android.support.design.widget.TabItem
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="C" />
    
        </android.support.design.widget.TabLayout>
    
        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:overScrollMode="never"
            android:scrollbars="none" />
    
    </LinearLayout>

    AFragment、 BFragment、 CFragment 对应的布局文件就不赘述了,可以随意自定义。

    源码下载:

    https://github.com/cnwutianhao/ViewPager

  • 相关阅读:
    hdu 4002 Find the maximum
    hdu 2837 坑题。
    hdu 3123
    zoj Treasure Hunt IV
    hdu 2053 Switch Game 水题一枚,鉴定完毕
    poj 1430 Binary Stirling Numbers
    hdu 3037 Saving Beans
    hdu 3944 dp?
    南阳oj 求N!的二进制表示最低位的1的位置(从右向左数)。
    fzu 2171 防守阵地 II
  • 原文地址:https://www.cnblogs.com/zoro-zero/p/11848526.html
Copyright © 2011-2022 走看看