Android androidx下的fragment懒加载

androidx下的fragment中onHiddenChanged方法不会被调用,这就导致了懒加载实现方式要变更
前置条件:

BottomNavigationView+ViewPager+fragment
FragmentPagerAdapter pagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager(),FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) 

说明一下behavior的值:

BEHAVIOR_SET_USER_VISIBLE_HINT:使用这个创建的时候,当当前页面fragment可见不可见的时候setUserVisibleHint方法会被调用,
也就是我们之前的懒加载方法仍然可以使用,只是目前setUserVisibleHint这个方法被取消了,不建议使用,所以创建时候这个也不建议使用
BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT:只有当前的fragment可见的时候,才会调用onResume方法,其他的只会调用到onStart方法

创建adapter对象,传入了behavior

这里不同fragment切换时候,只有在显示的时候才会调用onResum方法,所以只需要在onResume中判断是否可见就可以了,具体代码如下:

public abstract class BaseFragment extends Fragment {
   

    /**
     * 表示是否已经加载过了
     */
    private boolean isLoaded = false;
    /**
     * 表示是否可见
     */
    private boolean isVisible = false;

    @Override
    public void onResume() {
   
        super.onResume();
        isVisible = true;
        judzyLoadData();
    }

    private void judzyLoadData(){
   
        if (!isLoaded && isVisible){
   
            loadData();
            isLoaded = true;
        }
    }

    @Override
    public void onDestroy() {
   
        super.onDestroy();
        isVisible = false;
        isLoaded = false;
    }

    public abstract void loadData();
}

实际测试有效,只会调用一次
在这里插入图片描述
fragment内部嵌套fragment情况也测试了一下
三个主Fragment:HomeFragment、DashboardFragment、NotificationsFragment;在HomeFragment中嵌套3个MyFragment,测试懒加载方法,但是如果HomeFragment内部创建子Fragment方式一样,就会导致调用onCreateView方法,重新创建ViewPager和内部Fragment,所以需要只创建一次fragment

原来Activity中实现方法:

public class FragmentTestActivity1 extends AppCompatActivity {
   

    private BottomNavigationView bottomNavigationView;
    private ViewPager viewPager;
    private List<Fragment> fragments;
    private List<String> titles;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment_test1);
        bottomNavigationView = findViewById(R.id.bottom_navigation);
        viewPager =findViewById(R.id.pager);

        fragments = new ArrayList<>();
        titles = new ArrayList<>();

        fragments.add(new HomeFragment("homeFragment1"));
        titles.add("homeFragment1");
        fragments.add(new DashboardFragment(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值