android viewpager+fragment 避免预加载,缓存

一、需求是这样的:滑动到哪一页就在家一页的数据,避免预加载

 

二、由于使用setOffScreenLimit无效

解决办法:

[java] view plain copy
 
  1. <span style="color:#ff6666;">注意:setUserVisibleHint,使用这个方法来完成切换到哪一页才加载哪一页</span>  

 

 

[java] view plain copy
 
  1. /** 
  2.  * 
  3.  *  
  4.  * @author Administrator 
  5.  *  
  6.  */  
  7. public class GestateKnowledgeBabyTabFragment extends TabBaseFragment implements LmbRequestCallBack {  
  8.     /** tab对应的帮的数据源 */  
  9.     private GestateBabyDataItem babyDataItem;  
  10.     /** tab对应帮分类Id */  
  11.     private int babyTabId;  
  12.   
  13.     /** 缓存当前fragment显示的view,用以当销毁view但fragment没销毁时的回复 */  
  14.     private View cacheFragmentView;  
  15.       
  16.     /** 当前fragment是否是可见的 */  
  17.     private boolean isFragmentVisible;  
  18.     /** 是否已经加载了view,若已经加载了,不会再执行 */  
  19.     private boolean isPrepared;  
  20.   
  21.     /** 
  22.      *  
  23.      * @Description : 
  24.      * @author:zhongwr 
  25.      * @param :babyTabId tab对应的id,不能为空 
  26.      * @param :categoryBangList 如果不为空则数据已经加载过,不用再次请求,如果为空,表示数据没请求过,则请求网络获取数据 
  27.      * @return :void 
  28.      */  
  29.     public static GestateKnowledgeBabyTabFragment newInstance(int babyTabId, GestateBabyDataItem babyDataItem) {  
  30.         GestateKnowledgeBabyTabFragment bangFragment = new GestateKnowledgeBabyTabFragment();  
  31.         Bundle argsBundle = new Bundle();  
  32.         argsBundle.putInt("babyTabId", babyTabId);  
  33.         argsBundle.putSerializable("babyDataItem", babyDataItem);  
  34.         bangFragment.setArguments(argsBundle);  
  35.         return bangFragment;  
  36.     }  
  37.   
  38.     /** 
  39.      * isVisibleToUser:true:表示该UI可以被当前用户可见;false:表示不可见 是在oncreateView之前执行 
  40.      * 
  41.      *<span style="color:#ff0000;"> 执行顺序,用于预加载时,不会执行,第二次执行可见时,由于不会执行oncreateView,所以用此来加载第二次获取 setUserVisibleHint false--setUserVisibleHint 
  42.      * true--onAttach--onCreate--onCreateView--onActivityCreated--onResume()</span> 
  43.      */  
  44.     @Override  
  45.     public void setUserVisibleHint(boolean isVisibleToUser) {  
  46.         super.setUserVisibleHint(isVisibleToUser);  
  47.         // 直接使用isVisibleToUser不准确  
  48.         isFragmentVisible = getUserVisibleHint();  
  49.         // 第一次加载fragment(由于是viewpager可能是预加载,导致isFragmentVisible=false不可见)并执行此方法时,  
  50.         // mactivity==null,当滑动选中,此时activity已经赋值,并且isFragmentVisible=true,再次执行这方法时不会执行oncreateView  
  51.         if (null != activity && isFragmentVisible && !isPrepared) {  
  52.             onCreateContentView(LayoutInflater.from(activity), null);  
  53.         }  
  54.     }  
  55.   
  56.     @Override  
  57.     public View onCreateViewComplete(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  58.         Logcat.dLog("isFragmentVisible = " + isFragmentVisible);  
  59.         Logcat.dLog("babyTabId = " + babyTabId);  
  60.         if (null == cacheFragmentView && isFragmentVisible) {  
  61.             isPrepared = true;  
  62.             View view = cacheFragmentView = inflater.inflate(R.layout.gestate_baby_knowledge_fragment, null);  
  63.             activity = getActivity();  
  64.             initView(view);  
  65.             initListener();  
  66.             initData();  
  67.         }  
  68.         return cacheFragmentView;  
  69.     }  
  70.   
  71.     private void initView(View view) {  
  72.           
  73.     }  
  74.   
  75.     /** 
  76.      *  
  77.      * @description 更新数据 
  78.      * @author zhongwr 
  79.      * @update 2015-11-28 下午6:17:49 
  80.      */  
  81.     private void updateViewData(GestateBabyDataItem babyDataItem) {  
  82.         if (null != babyDataItem) {  
  83.             setClickToReloadGone();  
  84.               
  85.             if (null != babyDataItem.bbchange_data && !Tools.isEmpty(babyDataItem.bbchange_data.title)) {  
  86.                 llBabyChangeParent.setVisibility(View.VISIBLE);  
  87.                 tvBabyChangeContent.setText(babyDataItem.bbchange_data.text);  
  88.                 tvBabyChangeTitle.setText(babyDataItem.bbchange_data.title);  
  89.             } else {  
  90.                 llBabyChangeParent.setVisibility(View.GONE);  
  91.             }  
  92.             // 营养提醒  
  93.             if (null != babyDataItem.nutrition_data && !Tools.isEmpty(babyDataItem.nutrition_data.title)) {  
  94.                 llNutritionParent.setVisibility(View.VISIBLE);  
  95.                 tvNutritionContent.setText(babyDataItem.nutrition_data.text);  
  96.                 tvNutritionTitle.setText(babyDataItem.nutrition_data.title);  
  97.             } else {  
  98.                 llNutritionParent.setVisibility(View.GONE);  
  99.             }  
  100.               
  101.             if (null != babyDataItem.early_data && !Tools.isEmpty(babyDataItem.early_data.title)) {  
  102.                 llEarlyParent.setVisibility(View.VISIBLE);  
  103.                 tvEarlyContent.setText(Html.fromHtml(babyDataItem.early_data.text));  
  104.                 tvEarlyTitle.setText(babyDataItem.early_data.title);  
  105.                 setViewOnClickListener(llEarlyParent, babyDataItem.early_data.id);  
  106.             } else {  
  107.                 llEarlyParent.setVisibility(View.GONE);  
  108.             }  
  109.               
  110.             if (null != babyDataItem.month_data && !Tools.isEmpty(babyDataItem.month_data.title)) {  
  111.                 llConfinementParent.setVisibility(View.VISIBLE);  
  112.                 tvConfinementTitle.setText(babyDataItem.month_data.title);  
  113.                 tvConfinementContentTitle.setText(babyDataItem.month_data.small_title);  
  114.                 tvConfinementContent.setText(Html.fromHtml(babyDataItem.month_data.text));  
  115.                 imageLoader.displayImage(babyDataItem.month_data.pic, ivConfinementHeadPic, options565);  
  116.                 setViewOnClickListener(llConfinementParent, babyDataItem.month_data.id);  
  117.             } else {  
  118.                 llConfinementParent.setVisibility(View.GONE);  
  119.             }  
  120.             // 推荐阅读  
  121.             if (null != babyDataItem.tuijian_data && !Tools.isEmpty(babyDataItem.tuijian_data.title)) {  
  122.                 llRecommendedParent.setVisibility(View.VISIBLE);  
  123.                 tvRecommendedTitle.setText(babyDataItem.tuijian_data.title);  
  124.                 tvRecommendedContentTitle.setText(babyDataItem.tuijian_data.small_title);  
  125.                 tvRecommendedContent.setText(Html.fromHtml(babyDataItem.tuijian_data.text));  
  126.                 setBigImageView(babyDataItem.tuijian_data.pic, ivRecommendedPic);  
  127.                 setViewOnClickListener(llRecommendedParent, babyDataItem.tuijian_data.id);  
  128.             } else {  
  129.                 llRecommendedParent.setVisibility(View.GONE);  
  130.             }  
  131.               
  132.             if (null != babyDataItem.expert_data && !Tools.isEmpty(babyDataItem.expert_data.title)) {  
  133.                 llExpertParent.setVisibility(View.VISIBLE);  
  134.                 tvExpertTitle.setText(babyDataItem.expert_data.title);  
  135.                 tvExpertContentTitle.setText(babyDataItem.expert_data.small_title);  
  136.                 tvExpertContent.setText(babyDataItem.expert_data.text);  
  137.                 imageLoader.displayImage(babyDataItem.expert_data.pic, ivExpertHeadPic, options565);  
  138.                 setViewOnClickListener(llExpertParent, babyDataItem.expert_data.id);  
  139.             } else {  
  140.                 llExpertParent.setVisibility(View.GONE);  
  141.             }  
  142.               
  143.             if (null != babyDataItem.expert_video_data && !Tools.isEmpty(babyDataItem.expert_video_data.title)) {  
  144.                 llVideoParent.setVisibility(View.VISIBLE);  
  145.                 tvVideoTitle.setText(babyDataItem.expert_video_data.title);  
  146.                 tvVideoContent.setText(babyDataItem.expert_video_data.small_title);  
  147.                 setBigImageView(babyDataItem.expert_video_data.pic, ivVideoPic);  
  148.                 setViewOnClickListener(ivVideoPlay, babyDataItem.expert_video_data.id);  
  149.             } else {  
  150.                 llVideoParent.setVisibility(View.GONE);  
  151.             }  
  152.             addTagView(babyDataItem.tag_data, flowLayoutTag);  
  153.         } else {  
  154.             setLoadDataEmpty();  
  155.         }  
  156.     }  
  157.   
  158.     /*** 
  159.      *  
  160.      * @description  
  161.      * @author zhongwr 
  162.      * @update 2015-11-30 下午6:09:53 
  163.      */  
  164.     private void setViewOnClickListener(View view, final String id) {  
  165.         view.setTag(id);  
  166.         view.setOnClickListener(clickViewJumpListener);  
  167.     }  
  168.   
  169.       
  170.     private OnClickListener clickViewJumpListener = new OnClickListener() {  
  171.   
  172.         @Override  
  173.         public void onClick(View v) {  
  174.             String id = (String) v.getTag();  
  175.               
  176.         }  
  177.     };  
  178.   
  179.     /** 
  180.      *  
  181.      * @description 设置tag标签 
  182.      * @author zhongwr 
  183.      * @update 2015-11-12 下午6:18:07 
  184.      */  
  185.     private void addTagView(GestateBabyTagContainerItem containerItem, FlowLayout flowLayoutTag) {  
  186.         if (null == containerItem || Tools.isEmpty(containerItem.title) || Tools.isListEmpty(containerItem.list)) {  
  187.             llTagParent.setVisibility(View.GONE);  
  188.             return;  
  189.         }  
  190.         List<GestateBabyTagItem> tagList = containerItem.list;  
  191.         flowLayoutTag.removeAllViews();  
  192.         llTagParent.setVisibility(View.VISIBLE);  
  193.         tvTagTitle.setText(containerItem.title);  
  194.         TextView bt = null;  
  195.         int padding = Tools.dip2px(activity, 12);  
  196.         GestateBabyTagItem tagItem;  
  197.         for (int i = 0; i < tagList.size(); i++) {  
  198.             tagItem = tagList.get(i);  
  199.             bt = new TextView(activity);  
  200.             bt.setText(tagItem.small_title != null ? tagItem.small_title : "未知");  
  201.             bt.setTextColor(getResources().getColor(R.color.red1));  
  202.             bt.setGravity(Gravity.CENTER);  
  203.             bt.setBackgroundResource(R.drawable.preg_tag_bg);  
  204.             bt.setTextSize(13);  
  205.             bt.setPadding(padding, 0, padding, 0);  
  206.             bt.setTag(tagItem);  
  207.             final String tagId = tagItem.id;  
  208.             final String title = tagItem.small_title;  
  209.             bt.setOnClickListener(new View.OnClickListener() {  
  210.   
  211.                 @Override  
  212.                 public void onClick(View v) {  
  213.                     KnowledgeLabelDetailActivity.startKnowledgeLabelDetailAct(activity, tagId, title, "1", null);  
  214.                 }  
  215.             });  
  216.   
  217.             flowLayoutTag.addView(bt);  
  218.         }  
  219.     }  
  220.   
  221.     private void initListener() {  
  222.         setReloadListener(new Reload() {// 出错重新加载  
  223.             @Override  
  224.             public void OnReloadClick(View view) {  
  225.                 requestBabyKnowledgeData();  
  226.             }  
  227.         });  
  228.     }  
  229.   
  230.     private void initData() {  
  231.         Bundle argsBundle = getArguments();  
  232.         if (null != argsBundle) {  
  233.             babyTabId = argsBundle.getInt("babyTabId", 1);  
  234.             babyDataItem = (GestateBabyDataItem) argsBundle.getSerializable("babyDataItem");  
  235.         }  
  236.         if (null == babyDataItem) {  
  237.             requestBabyKnowledgeData();  
  238.         } else {  
  239.             updateViewData(babyDataItem);  
  240.         }  
  241.     }  
  242.   
  243.       
  244.   
  245. }  

 

 

[java] view plain copy
 
  1. /** 
  2.  * 各类tab通用一个Basefragment : 比如 各类tab: 功能: 出错机制处理 
  3.  *  
  4.  * @author Administrator 
  5.  *  
  6.  */  
  7. public abstract class TabBaseFragment extends BaseFragment {  
  8.     public ClickScreenToReload clickToReload;  
  9.     private FrameLayout mViewContainer;  
  10.   
  11.     @Override  
  12.     public void onAttach(Activity activity) {  
  13.         super.onAttach(activity);  
  14.         this.activity = activity;  
  15.     }  
  16.   
  17.     @Override  
  18.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  19.         if (null == mViewContainer) {  
  20.             View view = inflater.inflate(R.layout.mam_base_main, null);  
  21.             mViewContainer = (FrameLayout) view.findViewById(R.id.base_container);  
  22.         }  
  23.         onCreateContentView(inflater, savedInstanceState);  
  24.         return mViewContainer;  
  25.     }  
  26.   
  27.     public void onCreateContentView(LayoutInflater inflater, Bundle savedInstanceState) {  
  28.         if (null != mViewContainer) {  
  29.             mViewContainer.removeAllViews();  
  30.             RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,  
  31.                     RelativeLayout.LayoutParams.MATCH_PARENT);  
  32.             clickToReload = new ClickScreenToReload(activity);  
  33.             clickToReload.setVisibility(View.GONE);  
  34.             View viewContent = onCreateViewComplete(inflater, mViewContainer, savedInstanceState);  
  35.             if (null != viewContent) {  
  36.                 mViewContainer.addView(viewContent, lp);  
  37.             }  
  38.             mViewContainer.addView(clickToReload, lp);  
  39.         }  
  40.     }  
  41.   
  42.     @Override  
  43.     public void onDestroyView() {  
  44.         super.onDestroyView();  
  45.         ViewGroup parent = (ViewGroup) mViewContainer.getParent();  
  46.         if (null != parent) {// 必须先清除父布局中的child,否则会报错“当前父布局已经有了一个child,不能再添加”  
  47.             mViewContainer.removeAllViewsInLayout();  
  48.             parent.removeView(mViewContainer);  
  49.         }  
  50.     }  
  51.   
  52.     /*** 
  53.      *  
  54.      * @description 创建view 
  55.      * @author zhongwr 
  56.      * @update 2015-11-4 下午5:27:36 
  57.      */  
  58.     public abstract View onCreateViewComplete(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);  
  59.   
  60.     /** 
  61.      *  
  62.      * @description 设置网络不可见,点击重新加载 
  63.      * @author zhongwr 
  64.      * @update 2015-11-4 下午5:07:12 
  65.      */  
  66.     protected void setReloadVisiable() {  
  67.         clickToReload.setVisibility(View.VISIBLE);  
  68.         clickToReload.setloadfail();  
  69.     }  
  70.   
  71.     /** 
  72.      *  
  73.      * @description 设置加载数据为空 
  74.      * @author zhongwr 
  75.      * @update 2015-11-4 下午5:07:12 
  76.      */  
  77.     protected void setLoadDataEmpty() {  
  78.         clickToReload.setVisibility(View.VISIBLE);  
  79.         clickToReload.setloadEmpty();  
  80.     }  
  81.   
  82.     /** 
  83.      *  
  84.      * @description 设置正在加载 
  85.      * @author zhongwr 
  86.      * @update 2015-11-4 下午5:08:29 
  87.      */  
  88.     protected void setLoadingVisiable() {  
  89.         clickToReload.setVisibility(View.VISIBLE);  
  90.         clickToReload.setLoading();  
  91.     }  
  92.   
  93.     /** 
  94.      *  
  95.      * @description 隐藏这个出错界面 
  96.      * @author zhongwr 
  97.      * @update 2015-11-4 下午5:09:24 
  98.      */  
  99.     protected void setClickToReloadGone() {  
  100.         clickToReload.setVisibility(View.GONE);  
  101.     }  
  102.   
  103.     /** 
  104.      *  
  105.      * @description 重新加载的监听器 
  106.      * @author zhongwr 
  107.      * @update 2015-11-4 下午5:32:44 
  108.      */  
  109.     protected void setReloadListener(Reload reloadListener) {  
  110.         clickToReload.setReloadClick(reloadListener);  
  111.     }  
  112.   
  113.     /** 屏幕的三分之一 */  
  114.     private int screenWidthThirdOne = Tools.getScreenSize(activity).x / 3;  
  115.   
  116.     /** 
  117.      *  
  118.      * @description 适配图片大图:图片布局除了间距显示宽度充满整个屏幕 
  119.      * @author zhongwr 
  120.      * @update 2015-11-13 上午11:32:08 
  121.      */  
  122.     protected void setBigImageView(String picUrl, final ImageView ivPic) {  
  123.         imageLoader.displayImage(picUrl, ivPic, options565, new SimpleImageLoadingListener() {  
  124.             @Override  
  125.             public void onLoadingComplete(String imageUri, final View view, final Bitmap loadedImage) {  
  126.                 if (null != loadedImage) {// 设置成背景,清除src否则重叠  
  127.                     ivPic.post(new Runnable() {  
  128.                         @Override  
  129.                         public void run() {  
  130.                             int ivMeasureWidth = ivPic.getMeasuredWidth();  
  131.                             LayoutParams params = ivPic.getLayoutParams();  
  132.                             int bmWidth = loadedImage.getWidth();  
  133.                             if (bmWidth < screenWidthThirdOne) {// 处理小图  
  134.                                 params.height = LayoutParams.WRAP_CONTENT;  
  135.                                 params.width = bmWidth;  
  136.                             } else if (ivMeasureWidth > 0) {  
  137.                                 // 按原图的比例缩放  
  138.                                 params.height = ivMeasureWidth * loadedImage.getHeight() / bmWidth;  
  139.                                 params.width = ivMeasureWidth;  
  140.                             }  
  141.                             ivPic.setBackgroundDrawable(null);  
  142.                             ivPic.setImageDrawable(new BitmapDrawable(loadedImage));  
  143.                         }  
  144.                     });  
  145.                 } else {  
  146.                     ivPic.setImageDrawable(null);// 设置成背景,清除src否则重叠  
  147.                     ivPic.setBackgroundResource(R.drawable.default_user_head);  
  148.                 }  
  149.             }  
  150.   
  151.             @Override  
  152.             public void onLoadingFailed(String imageUri, View view, FailReason failReason) {  
  153.                 ivPic.setImageDrawable(null);// 设置成背景,清除src否则重叠  
  154.                 ivPic.setBackgroundResource(R.drawable.default_user_head);  
  155.             }  
  156.         });  
  157.     }  
  158. }  
posted @ 2017-04-25 10:47  天涯海角路  阅读(896)  评论(0)    收藏  举报