FragmentStatePager实例化我的Fragment两次

时间:2015-02-27 01:57:55

标签: android-fragments android-viewpager

我使用以下自定义viewPager和FragmentStatePagerAdapter来创建一组片段供用户编写特定的配置文件。 SQL可以相对于viewpager的子页面的位置检索用户的数据。当涉及到执行时,我看到片段在第一次加载时被创建两次并滑动到其他未缓存的页面。我找到了referenceFragment Hash映射来检索当前要加载一次的片段,而不是要加载两个片段。请你告诉我加载片段一次的更好方法吗?

以下是我的工作:

static SectionsPagerAdapter mSectionsPagerAdapter;
    static CustomViewPager mViewPager;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    mSectionsPagerAdapter = new SectionsPagerAdapter(fm);       
        dotsCount = mSectionsPagerAdapter.getCount();
        dots = new  ImageView[dotsCount];
        dots[0] = dot1;
        dots[1] = dot2;
        dots[2] = dot3;
        dots[3] = dot4;
        dots[4] = dot5;     
        dots[5] = dot6;     
        dots[6] = dot7;     
        setUiPageViewController();
        isTablet=  ReadExcel.isTabletDevice(this);
        mViewPager = (CustomViewPager) findViewById(R.id.pager);        
        mViewPager.setAdapter(mSectionsPagerAdapter);
        mViewPager.setEnabled(true);
        mViewPager.setOffscreenPageLimit(0);
        mViewPager.setOnPageChangeListener(viewPagerPageChangeListener);

    public static class PlaceholderFragment extends Fragment  {

        private static final String ARG_SECTION_NUMBER = "section_number";

        public static PlaceholderFragment newInstance(int sectionNumber) {
        //  PlaceholderFragment fragment = new PlaceholderFragment();

            PlaceholderFragment fragment =  ((SectionsPagerAdapter)mViewPager.getAdapter()).getFragment(sectionNumber);
            if(fragment==null){
                fragment = new PlaceholderFragment();
            }
            Bundle args = new Bundle(); 
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setTag(String.valueOf(sectionNumber));
            fragment.setArguments(args);            


            return fragment;
        }

        public  String getFTag(){
            return tag;
        }

        public void setTag(String tag) {
            this.tag = tag;
        }


        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            super.onCreateView(inflater, container, savedInstanceState); 

....}}

public class SectionsPagerAdapter extends FragmentStatePagerAdapter {


        private Map<Integer, PlaceholderFragment> mPageReferenceMap = new HashMap<Integer, PlaceholderFragment>();


        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public int getItemPosition(Object object) {
            return PagerAdapter.POSITION_NONE;
        }


        @Override
        public Fragment getItem(int position) {
            for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
                fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);                        
            } 


            PlaceholderFragment pf =  PlaceholderFragment.newInstance(position);
            mPageReferenceMap.put(Integer.valueOf(position), pf);

            return pf;
        }

        @SuppressWarnings("deprecation")
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            super.destroyItem(container, position, object);
            mPageReferenceMap.remove(Integer.valueOf(position));

            // mPageReferenceMap.remove(position);
        }

        public PlaceholderFragment getFragment(int key) {

            return mPageReferenceMap.get(key);
        }



        @Override
        public int getCount() {
            return 7;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
            case 0:
                return getString(R.string.title_section1).toUpperCase(l);
            case 1:
                return getString(R.string.title_section2).toUpperCase(l);
            }
            return null;
        }
    }

0 个答案:

没有答案