fragment+viewpager的懒加载

公司的app中是使用viewpager加载fragment:每个viewpager页面都是一个fragment,fragment的内容从网上获取,需要实现的功能是当切换viewpager的不同页面时,能流畅的显示已经加载过的页面。

实现的方法很简答。因为viewpager有缓存的功能。

         mViewPager.setOffscreenPageLimit(6);  

只需添加这一句话就能实现:对于已经加载过的fragment,当被切换后,不会触发该fragment的任何事件。当切换回来时可以正常显示。

需要注意的是:这句话的功能 是设置预缓存的fragment(或其他view)的个数。如果设置数字过大,当你加载当前fragment时还会预加载未显示的fragment导致加载当前页面过慢。所以这个数字应该选择合适的值。

详细内容博客链接:http://blog.csdn.net/zhouzme/article/details/19707677

  1. package com.cosmosource.mbi.fragment;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import cn.jiabeis.andr.log.CommonLog;
  5. import cn.jiabeis.andr.log.LogFactory;
  6. import com.cosmosource.mbi.MainActivity;
  7. import com.cosmosource.mbi.R;
  8. import com.cosmosource.mbi.adapter.TabPagerAdapter;
  9. import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
  10. import android.os.Bundle;
  11. import android.os.Handler;
  12. import android.support.v4.app.Fragment;
  13. import android.support.v4.view.PagerAdapter;
  14. import android.support.v4.view.ViewPager;
  15. import android.support.v4.view.ViewPager.OnPageChangeListener;
  16. import android.view.LayoutInflater;
  17. import android.view.View;
  18. import android.view.ViewGroup;
  19. import android.view.ViewParent;
  20. /**
  21. * @description viewerPager的fragment
  22. * @author herb
  23. * @version 0.1
  24. * @since 2013-11-18 上午10:29:37
  25. */
  26. public class ViewPagerFragment extends CommonFragment{
  27. private static final CommonLog log = LogFactory.createLog();
  28. /**
  29. * ViewPager对象的引用
  30. */
  31. public ViewPager mviewPager;
  32. /**
  33. * 装载Fragment的容器,我们的每一个界面都是一个Fragment
  34. */
  35. private List<Fragment> mfragmentList = new ArrayList<Fragment>();
  36. /**
  37. * 用于记录已经浏览过的fragment,不再重新从网上加载,因为当切换fragemnt时viewpager的缓存功能
  38. * 不会触发fragment的任何事件。可以完整保存。
  39. * jkx
  40. */
  41. private List<Fragment> browsedfragmentList = new ArrayList<Fragment>();
  42. private TabPagerAdapter tpa = null;
  43. public List<Fragment> getMfragmentList() {
  44. return mfragmentList;
  45. }
  46. public void setMfragmentList(List<Fragment> mfragmentList) {
  47. this.mfragmentList = mfragmentList;
  48. }
  49. @Override
  50. public void onCreate(Bundle savedInstanceState) {
  51. super.onCreate(savedInstanceState);
  52. }
  53. @Override
  54. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  55. Bundle savedInstanceState) {
  56. if(mView==null){
  57. mView = inflater.inflate(R.layout.frame_viewpager_layout, null);
  58. mviewPager = (ViewPager)mView.findViewById(R.id.viewPager);
  59. //设置监听
  60. mviewPager.setOnPageChangeListener(new MySetOnPageChangeListener());
  61. //缓存多个子页面,预缓存16个菜单项
  62. mviewPager.setOffscreenPageLimit(15);
  63. /*解决:java.lang.IllegalStateException: Recursive entry to executePendingTransaction*/
  64. new Handler().postDelayed(new Runnable() {
  65. @Override
  66. public void run() {
  67. tpa = new TabPagerAdapter(getFragmentManager(), mfragmentList);
  68. mviewPager.setAdapter(tpa);
  69. mviewPager.setCurrentItem(0);
  70. /*这里加载url*/
  71. if (null != mfragmentList && mfragmentList.size() > 0) {
  72. //二级导航有多个,,默认显示第0个导航对应的fragment
  73. Fragment ff = mfragmentList.get(0);
  74. if (null != ff && ff instanceof WebviewFragment) {
  75. ((WebviewFragment)ff).cusLoadURL();
  76. }
  77. }
  78. }
  79. }, 10);
  80. }else{
  81. System.out.println("ViewPagerFragment:mView不为空,复用");
  82. }
  83. return mView;
  84. }
  85. @Override
  86. public void onActivityCreated(Bundle savedInstanceState) {
  87. super.onActivityCreated(savedInstanceState);
  88. setupViews();
  89. }
  90. private void setupViews() {
  91. }
  92. @Override
  93. public void onDestroy() {
  94. super.onDestroy();
  95. }
  96. @Override
  97. public void onDestroyView() {
  98. // TODO Auto-generated method stub
  99. super.onDestroyView();
  100. if(null!=mView){
  101. ((ViewGroup) mView.getParent()).removeView(mView);
  102. }
  103. }
  104. /**
  105. * ViewPager页面选项卡切换监听器
  106. */
  107. class MySetOnPageChangeListener implements OnPageChangeListener
  108. {
  109. public void onPageScrollStateChanged(int arg0) {
  110. }
  111. public void onPageScrolled(int arg0, float arg1, int arg2) {
  112. }
  113. public void onPageSelected(int position) {
  114. Fragment ff = mfragmentList.get(position);
  115. /**
  116. * 判断是否浏览过,如果没有则重新从网上加载。
  117. * jkx
  118. */
  119. if(!isBrowsered(ff)){
  120. if (null != ff && ff instanceof WebviewFragment) {
  121. ((WebviewFragment)ff).cusLoadURL();
  122. }
  123. browsedfragmentList.add(ff);
  124. System.out.println("已加载页面个数:"+browsedfragmentList.size());
  125. }
  126. MainActivity ma = (MainActivity)getActivity();
  127. if (null != ma) {
  128. ma.getSupportActionBar().setSelectedNavigationItem(position);
  129. int last = mviewPager.getChildCount()-1;
  130. if (position == last || position == 0){
  131. ma.getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
  132. } else {
  133. ma.getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
  134. }
  135. }
  136. }
  137. }
  138. /**
  139. * 判断该fragment是否已经浏览过。
  140. * @param fragment
  141. * @return
  142. * jkx
  143. */
  144. public boolean isBrowsered(Fragment fragment){
  145. if(browsedfragmentList.contains(fragment)){
  146. return true ;
  147. }else{
  148. return false ;
  149. }
  150. }
  151. }
原文地址:https://www.cnblogs.com/jkx1229761162/p/4761186.html