zoukankan      html  css  js  c++  java
  • [Android]实现类似微信的延迟加载的Fragment——LazyFragment

    以下内容为原创,转载请注明:

    来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4303910.html 

    参考微信,使用ViewPager来显示不同的tab,每个tab是一个Fragment,

    假设有3个tab,对应的fragment是FragmentA、FragmentB、FragmentC

    需要实现的效果是进入后,默认先只加载FragmentA,具体滑动到了哪个Fragment,再去加载该Fragment的数据。

    可以参考如下BaseLazyFragment代码:

      1 /**
      2  * Author: wangjie
      3  * Email: tiantian.china.2@gmail.com
      4  * Date: 1/23/15.
      5  */
      6 public class BaseLazyFragment extends BaseFragment {
      7     private static final String TAG = BaseLazyFragment.class.getSimpleName();
      8     private boolean isPrepared;
      9 
     10     @Override
     11     public void onActivityCreated(Bundle savedInstanceState) {
     12         super.onActivityCreated(savedInstanceState);
     13         initPrepare();
     14     }
     15 
     16 
     17     /**
     18      * 第一次onResume中的调用onUserVisible避免操作与onFirstUserVisible操作重复
     19      */
     20     private boolean isFirstResume = true;
     21 
     22     @Override
     23     public void onResume() {
     24         super.onResume();
     25         if (isFirstResume) {
     26             isFirstResume = false;
     27             return;
     28         }
     29         if (getUserVisibleHint()) {
     30             onUserVisible();
     31         }
     32     }
     33 
     34     @Override
     35     public void onPause() {
     36         super.onPause();
     37         if (getUserVisibleHint()) {
     38             onUserInvisible();
     39         }
     40     }
     41 
     42     private boolean isFirstVisible = true;
     43     private boolean isFirstInvisible = true;
     44 
     45     @Override
     46     public void setUserVisibleHint(boolean isVisibleToUser) {
     47         super.setUserVisibleHint(isVisibleToUser);
     48         if (isVisibleToUser) {
     49             if (isFirstVisible) {
     50                 isFirstVisible = false;
     51                 initPrepare();
     52             } else {
     53                 onUserVisible();
     54             }
     55         } else {
     56             if (isFirstInvisible) {
     57                 isFirstInvisible = false;
     58                 onFirstUserInvisible();
     59             } else {
     60                 onUserInvisible();
     61             }
     62         }
     63     }
     64 
     65     public synchronized void initPrepare() {
     66         if (isPrepared) {
     67             onFirstUserVisible();
     68         } else {
     69             isPrepared = true;
     70         }
     71     }
     72 
     73     /**
     74      * 第一次fragment可见(进行初始化工作)
     75      */
     76     public void onFirstUserVisible() {
     77 
     78     }
     79 
     80     /**
     81      * fragment可见(切换回来或者onResume)
     82      */
     83     public void onUserVisible() {
     84 
     85     }
     86 
     87     /**
     88      * 第一次fragment不可见(不建议在此处理事件)
     89      */
     90     public void onFirstUserInvisible() {
     91 
     92     }
     93 
     94     /**
     95      * fragment不可见(切换掉或者onPause)
     96      */
     97     public void onUserInvisible() {
     98 
     99     }
    100 
    101 }

    如上代码,使用setUserVisibleHint方法作为回调的依据,

    暴露出来让子类使用的新的生命周期方法为:

    - onFirstUserVisible();

    第一次fragment可见(进行初始化工作)

    - onUserVisible(); 

    fragment可见(切换回来或者onResume)

    - onFirstUserInvisible();

    第一次fragment不可见(不建议在此处理事件)

    - onUserInvisible();

    fragment不可见(切换掉或者onPause)

    具体的效果是:

    1. 首先加载ViewPager,回调FragmentA(第一个默认呈现的Fragment)的onFirstUserVisible(),可以在这里进行FragmentA的初始化工作,其他Fragment保持不变。

    2. 用户从FragmentA滑动到FragmentB,回调FragmentA的onUserInvisible()、FragmentB的onFirstUserVisible()(因为第一次切换到FragmentB,可以在这里进行初始化工作)。

    3. 用户从FragmentB滑动到FragmentC,回调FragmentB的onUserInvisible()、FragmentC的onFirstUserVisible()(因为第一次切换到FragmentC,可以在这里进行初始化工作)。

    4. 用户从FragmentC滑动到FragmentB,回调FragmentC的onUserInvisible()、FragmentB的onUserVisible()(因为FragmentB之前已经被加载过)。

    5. 因为到此为止,suoyou的Fragment都已经被加载过了,所以以后这3个Fragment互相任意切换,只会回调原来Fragment的onUserInvisible()和切换后的Fragment的onUserVisible()。

    6. 用户处于FragmentB,关闭手机屏幕,回调FragmentB的onUserInvisible()。

    7. 用户处于FragmentB,手机屏幕处关闭状态,然后开启手机屏幕解锁,只回调FragmentB的onUserVisible()。

  • 相关阅读:
    YII 项目部署时, 显示空白内容
    github上传项目(使用git)、删除项目、添加协作者
    Mysql 报错:#1067
    解决:500 Internal Privoxy Error
    解决bcp导出CSV文件没有表头
    asp.net 获取当前,相对,绝对路径
    BCP 运行错误
    cmd 运行bcp 提示:'bcp' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    Android--数据持久化之SQLite
    Android--JUnit单元测试
  • 原文地址:https://www.cnblogs.com/tiantianbyconan/p/4303910.html
Copyright © 2011-2022 走看看