• 使用ViewPager切换Fragment时,防止频繁调用OnCreatView


    使用ViewPager切换Fragment,我原先使用系统自带的适配器FragmentPagerAdapter。

    切换fragment时,频繁调用oncreatview()。

    查看FragmentPagerAdapter的源码,发现两个关键的地方

     1 @Override
     2     public Object instantiateItem(ViewGroup container, int position) {
     3         if (mCurTransaction == null) {
     4             mCurTransaction = mFragmentManager.beginTransaction();
     5         }
     6 
     7         final long itemId = getItemId(position);
     8 
     9         // Do we already have this fragment?
    10         String name = makeFragmentName(container.getId(), itemId);
    11         Fragment fragment = mFragmentManager.findFragmentByTag(name);
    12         if (fragment != null) {
    13             if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
    14            //该处使用attach导致频繁调用oncreatview
    15             mCurTransaction.attach(fragment);
    16 
    17         } else {
    18             fragment = getItem(position);
    19             if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
    20             mCurTransaction.add(container.getId(), fragment,
    21                     makeFragmentName(container.getId(), itemId));
    22         }
    23         if (fragment != mCurrentPrimaryItem) {
    24             fragment.setMenuVisibility(false);
    25             fragment.setUserVisibleHint(false);
    26         }
    27 
    28         return fragment;
    29     }
    30 
    31     @Override
    32     public void destroyItem(ViewGroup container, int position, Object object) {
    33         if (mCurTransaction == null) {
    34             mCurTransaction = mFragmentManager.beginTransaction();
    35         }
    36         if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
    37                 + " v=" + ((Fragment)object).getView());
    38         //该处使用detach导致频繁调用oncreatview
    39         mCurTransaction.detach((Fragment)object);
    40     }

    attach和detach的频繁使用导致了fragment频繁调用oncreatview。

    找到元凶了,接下来就好办了。

    自定义一个适配器,将attach改为show,将detach改为hide。

    完美解决问题。

    @Override
        public Object instantiateItem(ViewGroup container, int position) {
            if (mCurTransaction == null) {
                mCurTransaction = mFragmentManager.beginTransaction();
            }
    
            final long itemId = getItemId(position);
    
            // Do we already have this fragment?
            String name = makeFragmentName(container.getId(), itemId);
            Fragment fragment = mFragmentManager.findFragmentByTag(name);
            if (fragment != null) {
                if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
                //用show而不用attach,防止频繁调用oncreatview
                mCurTransaction.show(fragment);
            } else {
                fragment = getItem(position);
                if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
                mCurTransaction.add(container.getId(), fragment,
                        makeFragmentName(container.getId(), itemId));
            }
            if (fragment != mCurrentPrimaryItem) {
                fragment.setMenuVisibility(false);
                fragment.setUserVisibleHint(false);
            }
    
            return fragment;
        }
    
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            if (mCurTransaction == null) {
                mCurTransaction = mFragmentManager.beginTransaction();
            }
            if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
                    + " v=" + ((Fragment) object).getView());
            //用hide而不用detach,防止频繁调用oncreatview
            mCurTransaction.hide((Fragment) object);
        }
    View Code
  • 相关阅读:
    关于HashMap的线程安全问题
    Java利器之UML类图详解
    mongoDB4.0数据库
    requests-html库render的使用
    爬虫最新的库requests-html库总结
    爬虫多次爬取时候cookie的存储用于登入
    requests模块响应体属性和方法重新整理
    Visual Studio 代码补全功能有时候会失效的原因
    C++Primer笔记——文本查询程序(原创,未使用类)
    Clion 常用快捷键
  • 原文地址:https://www.cnblogs.com/shenchanghui/p/6094703.html
Copyright © 2020-2023  润新知