Как предварительно загрузить вкладку в TabLayout с помощью ViewPager - Android - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть галерея изображений, которые добавляются из Uris в основной деятельности, но страница не загружается, пока я не открою вкладку. Я пытаюсь предварительно загрузить страницу галереи в TabLayout с помощью ViewPager, чтобы она не отставала при открытии вкладки.

Я читал о Loaders в android studio, но после API 28. он устарел, и в нем говорится, что нужно использовать комбинацию ViewModels и LiveData. https://developer.android.com/guide/components/loaders

Я также нашел этот пост и переопределил метод setUserVisibleHint в своем классе галереи, но это не работает.

Предварительная загрузка TabLayout следующая вкладка

Вот мой код:

Основная деятельность:

        tabLayout = findViewById(R.id.tabLayout);
        pageAdapter = new PageAdapter(getSupportFragmentManager(), 3, getApplicationContext());
        final NonSwipeableViewPager viewPager = findViewById(R.id.viewPager);
        viewPager.setAdapter(pageAdapter);
        TabLayout tabs = findViewById(R.id.tabLayout);
        tabs.setupWithViewPager(viewPager);
        tabs.getTabAt(0).setIcon(R.drawable.location).getIcon().setColorFilter(Color.CYAN, PorterDuff.Mode.SRC_ATOP);
        tabs.getTabAt(1).setIcon(R.drawable.list).getIcon().setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);;
        tabs.getTabAt(2).setIcon(R.drawable.gallery).getIcon().setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);

        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                tab.getIcon().setColorFilter(Color.CYAN, PorterDuff.Mode.SRC_ATOP);
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                tab.getIcon().setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

Адаптер страницы:

public class PageAdapter extends FragmentPagerAdapter {

    private int numOfTabs;
    private Context context;
    private static final int[] TAB_TITLES = new int[]{R.string.tab_text_1, R.string.tab_text_2, R.string.tab_text_3};

    public PageAdapter(@NonNull FragmentManager fm, int numOfTabs, Context context) {
        super(fm);
        this.numOfTabs = numOfTabs;
        this.context = context;

    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        switch (position){
            case 0:
                return new MapsActivity();
            case 1:
                return new PreviousTrips();
            case 2:
                return new Gallery();
            default:
                return null;
        }
    }

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

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return context.getResources().getString(TAB_TITLES[position]);
    }
}

NonSwipeableViewPager:

public class NonSwipeableViewPager extends ViewPager {

    public NonSwipeableViewPager(Context context) {
        super(context);
        setMyScroller();
    }

    public NonSwipeableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        setMyScroller();
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        // Never allow swiping to switch between pages
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Never allow swiping to switch between pages
        return false;
    }

    private void setMyScroller() {
        try {
            Class<?> viewpager = ViewPager.class;
            Field scroller = viewpager.getDeclaredField("mScroller");
            scroller.setAccessible(true);
            scroller.set(this, new MyScroller(getContext()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public class MyScroller extends Scroller {
        public MyScroller(Context context) {
            super(context, new DecelerateInterpolator());
        }

        @Override
        public void startScroll(int startX, int startY, int dx, int dy, int duration) {
            super.startScroll(startX, startY, dx, dy, 350 /*1 secs*/);
        }
    }
}

1 Ответ

0 голосов
/ 14 апреля 2020

Мне удалось предварительно загрузить вкладки с помощью этого кода:

viewPager.setOffscreenPageLimit(3);

Но было бы лучше, если бы я мог загрузить другие вкладки в фоновом режиме после загрузки первой вкладки.

...