zoukankan      html  css  js  c++  java
  • 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. }
  • 相关阅读:
    JAVA编程规则【转自java编程思想】
    诊断 Java 代码: 轻松掌握 Java 泛型
    Linux开启telnet远程登录服务全攻略
    TCP详解
    UNIX环境高级编程文件描述符浅析
    DHCP与BOOTP有什么区别
    Linux 多播(组播)例程
    你所不知道的传输层
    虚电路方式,数据报方式
    java foreach 使用
  • 原文地址:https://www.cnblogs.com/jkx1229761162/p/4761186.html
Copyright © 2011-2022 走看看