У меня есть галерея изображений, которые добавляются из 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*/);
}
}
}