【Android】懶加載fragment+viewpager

BaseLoadFragment

當(dāng)fragment可見(jiàn)的時(shí)候再加載數(shù)據(jù)

public abstract class BaseLoadFragment<P extends IPresenter> extends BaseFragment<P> {

    private boolean isViewCreated; // 界面是否已創(chuàng)建完成
    private boolean isVisibleToUser; // 是否對(duì)用戶可見(jiàn)
    private boolean isDataLoaded; // 數(shù)據(jù)是否已請(qǐng)求

    /**
     * 第一次可見(jiàn)時(shí)觸發(fā)調(diào)用,此處實(shí)現(xiàn)具體的數(shù)據(jù)請(qǐng)求邏輯
     */
    protected abstract void lazyLoadData();

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        this.isVisibleToUser = isVisibleToUser;
        tryLoadData();
    }

    /**
     * 保證在initData后觸發(fā)
     */
    @Override
    public void onResume() {
        super.onResume();
        isViewCreated = true;
        tryLoadData();
    }

    /**
     * ViewPager場(chǎng)景下,判斷父fragment是否可見(jiàn)
     */
    private boolean isParentVisible() {
        Fragment fragment = getParentFragment();
        return fragment == null || (fragment instanceof BaseLoadFragment && ((BaseLoadFragment) fragment).isVisibleToUser);
    }

    /**
     * ViewPager場(chǎng)景下,當(dāng)前fragment可見(jiàn)時(shí),如果其子fragment也可見(jiàn),則讓子fragment請(qǐng)求數(shù)據(jù)
     */
    private void dispatchParentVisibleState() {
        FragmentManager fragmentManager = getChildFragmentManager();
        List<Fragment> fragments = fragmentManager.getFragments();
        if (fragments.isEmpty()) {
            return;
        }
        for (Fragment child : fragments) {
            if (child instanceof BaseLoadFragment && ((BaseLoadFragment) child).isVisibleToUser) {
                ((BaseLoadFragment) child).tryLoadData();
            }
        }
    }

    public void tryLoadData() {
//        boolean parentVisible = isParentVisible();
//        if (isViewCreated && isVisibleToUser && parentVisible && !isDataLoaded) {
        if (isViewCreated && isVisibleToUser && !isDataLoaded) {
            lazyLoadData();
            isDataLoaded = true;
            //通知子Fragment請(qǐng)求數(shù)據(jù)
            dispatchParentVisibleState();
        }
    }
}

新建fragment繼承自extends BaseLoadFragment,然后實(shí)現(xiàn)lazyLoadData,實(shí)現(xiàn)數(shù)據(jù)加載。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容