Как заставить мой медленный ViewPager работать быстрее - PullRequest
1 голос
/ 18 апреля 2019

Я создал Activity для обработки ViewPager. В начале все работало нормально, но потом мне пришлось добавить еще немного кода, чтобы он обновлял мои страницы при их выборе. Я справился с этим, вызывая метод onResume() при каждом изменении страницы.

Я оптимизировал свои фрагменты, очистил ненужный код (inside onResume()) в каждом из них, но это не дает результата. Вот так выглядит моя активность:

public class MainTabsActivity extends AppCompatActivity implements FullList.OnListFragmentInteractionListener, AcceptedList.OnListFragmentInteractionListener, StartedList.OnFragmentInteractionListener {

    private static final int NUM_TABS = 3;
    private SectionsPagerAdapter mSectionsPagerAdapter;
    private ViewPager mViewPager;
    TabLayout tabLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_tabs);

        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);
        mViewPager.setOffscreenPageLimit(2);
        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i1) {

            }
            @Override
            public void onPageSelected(int i) {
                Fragment fragment = ((SectionsPagerAdapter)mViewPager.getAdapter()).getFragment(i);

                if (fragment != null) {
                    Log.e("PAGE SELECTED", " " + i);
                    tabLayout.getTabAt(i).select();
                    fragment.onResume();
                }
            }
            @Override
            public void onPageScrollStateChanged(int i) {

            }

        });

        Intent i = getIntent();
        int pageNum = i.getIntExtra("pagenumber", 0);
        mViewPager.setCurrentItem(pageNum);
        tabLayout.getTabAt(pageNum).select();
        mViewPager.invalidate();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main_tabs, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onListFragmentInteraction(DummyContent.DummyItem item) {

    }

    @Override
    public void onFragmentInteraction(Uri uri) {

    }

    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        private Map<Integer, String> mFragmentTags;
        private FragmentManager mFragmentManager;

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
            mFragmentTags = new HashMap<>();
            mFragmentManager = fm;
        }

        @Nullable
        @Override
        public CharSequence getPageTitle(int position) {

            switch(position) {
                case 0:
                    return getString(R.string.tab_text_1);
                case 1:
                    return getString(R.string.tab_text_2);
                case 2:
                    return getString(R.string.tab_text_3);
            }
            return null;
        }

        @Override
        public Fragment getItem(int position) {

            switch (position) {
                case 0:
                    FullList tab1 = new FullList();
                    return tab1;

                case 1:
                    AcceptedList tab2 = new AcceptedList();
                    return tab2;

                case 2:
                    StartedList tab3 = new StartedList();
                    return tab3;

                default:
                    return null;
            }
        }

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

        @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, int position) {
            Object obj = super.instantiateItem(container, position);
            if (obj instanceof Fragment) {
                Fragment f = (Fragment) obj;
                String tag = f.getTag();
                mFragmentTags.put(position, tag);
            }
            return obj;
        }

        public Fragment getFragment(int position) {
            String tag = mFragmentTags.get(position);
            if (tag == null) return null;
            return mFragmentManager.findFragmentByTag(tag);
        }
    }
}

Я добавил код для вызова метода onResume(), но забавно то, что Fragments загружаются так долго, только когда я открываю этот Activity с другой, но не при прокрутке между страницами (все работает гладко потом) до изменений все было нормально.
Есть ли способ сделать это быстрее?

1 Ответ

0 голосов
/ 18 апреля 2019

Вам не нужно писать код onPageSelected, чтобы изменить выбор вкладки.

mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
mViewPager.setOffscreenPageLimit(2);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);   // this will synchronize our tablayout with your viewpager

Вы не должны вызывать onResume напрямую, это системное событие, и вызов этой пустоты не рекомендуется.

Также в вашем случае не нужно звонить mViewPager.invalidate()

...