在 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) { } }
CFragment
和BFragment
相似,就不贅述了。
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