簡體   English   中英

如何使我的慢速ViewPager更快地工作

[英]How to make my slow ViewPager to work faster

我創建了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時才加載了這么長的時間,而在頁面之間滾動時(一切都可以順利進行),而在更改所有內容之前精細。
有什么辦法可以使這項工作更快?

您無需編寫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 ,這是系統事件,建議不要調用此void。

另外,根據您的情況,無需調用mViewPager.invalidate()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM