[Android]实现类似微信的延迟加载的Fragment——LazyFragment


参考微信,使用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()。

 



来源博客:Wang Jie's Blog
本文链接:https://blog.wangjiegulu.com/2015/02/27/Android-实现类似微信的延迟加载的Fragment——LazyFragment/
版权声明:本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处。