Android ViewPager Загрузка неправильных фрагментов

Поэтому я пытаюсь получить панель вкладок и макет под моей основной навигационной панелью, работая над моей основной деятельностью.

Кажется, я не могу получить ViewPager / TabLayout (неуверенный, который является причиной проблемы, новичок в этом) для загрузки правильного фрагмента. Я прочитал тонну документации и проверил более 1 учебника, чтобы узнать, правильно ли я делаю это, и кажется, что я делаю то же самое, что и они …

OnTabSelectedListener для моего TabLayout видит, что вкладка изменяется правильно, а в OnTabSelected Im вызывает viewPager.setCurrentItem(tab.getPosition()) чтобы попытаться установить элемент viewpagers, но он все еще не работает. При первой загрузке он загружает первую и вторую вкладки (я могу видеть через отправленный запрос API из методов fragments onCreate), и когда я нажимаю на другие вкладки, он последовательно загружает неправильный фрагмент, иногда даже не загружая его вообще !

Не уверен, что это связано, но я получаю это предупреждение при переключении вкладок:

03-03 16:24:22.940 16967-16967/com.sampleapp.app W/FragmentManager: moveToState: Fragment state for BlankFragment3{efddbec #2 id=0x7f0c007b android:switcher:2131492987:2} not updated inline; expected state 3 found 2

Я использую средства сборки версии 23.0.2 и следующие зависимости:

 compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' compile 'com.android.support:support-v4:23.1.1' 

Это мой код макета для моей основной панели навигации:

 <?xml version="1.0" encoding="utf-8"?> 

 <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar1" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> <android.support.v7.widget.Toolbar android:id="@+id/toolbar2" android:layout_width="match_parent" android:layout_height="10dp" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> <android.support.design.widget.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMode="fixed" app:tabGravity="fill"/> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" android:src="@android:drawable/ic_input_add" /> </android.support.design.widget.CoordinatorLayout> 

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

 public class TabsAdapter extends FragmentPagerAdapter{ private final List<Fragment> mFragmentList = new ArrayList<>(); private final List<String> mFragmentTitleList = new ArrayList<>(); public TabsAdapter(FragmentManager fm) { super(fm); } public void addFrag(Fragment fragment, String title){ mFragmentList.add(fragment); mFragmentTitleList.add(title); } @Override public Fragment getItem(int position) { return mFragmentList.get(position); } @Override public int getCount() { return mFragmentList.size(); } @Override public CharSequence getPageTitle(int position) { return mFragmentTitleList.get(position); } } 

И вот как я установил свой просмотрщик и вкладку

MainActivity's onCreate:

  ViewPager = (ViewPager) findViewById(R.id.viewpager); setupViewPager(mViewPager); // Method defined below TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); tabLayout.setupWithViewPager(mViewPager); tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { mViewPager.setCurrentItem(tab.getPosition()); Log.w("Tab Selection", String.valueOf(tab.getPosition())); } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); 

И, наконец, мой метод setupViewPager:

 private void setupViewPager(ViewPager viewPager) { TabsAdapter adapter = new TabsAdapter(getSupportFragmentManager()); adapter.addFrag(new BlankFragment1(), "One"); adapter.addFrag(new BlankFragment2(), "Two"); adapter.addFrag(new BlankFragment3(), "Three"); viewPager.setAdapter(adapter); } 

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

Спасибо заранее!

Попробуйте использовать этот код: D

Адаптер ViewPager

 public class PageAdapter extends FragmentStatePagerAdapter { int mNumOfTabs; public PageAdapter(FragmentManager fm,int numTabs) { super(fm); this.mNumOfTabs = numTabs; } @Override public Fragment getItem(int position) { switch (position) { case 0: RemindsTab remindsTab = new RemindsTab(); return remindsTab; case 1: TasksTab tasksTab = new TasksTab(); return tasksTab; case 2: QuicklyNotesTab quicklyNotesTab = new QuicklyNotesTab(); return quicklyNotesTab; default: return null; } } @Override public int getCount() { return mNumOfTabs; } } 

И мой код в MainActivity для этих вкладок:

  final TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); tabLayout.addTab(tabLayout.newTab().setText("Recordatorios")); tabLayout.addTab(tabLayout.newTab().setText("Tareas")); tabLayout.addTab(tabLayout.newTab().setText("Notas Rapidas")); tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); final PagerAdapter adapter = new PageAdapter(getSupportFragmentManager(),tabLayout.getTabCount()); viewPager.setAdapter(adapter); viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); 

Надеюсь, что вы сможете решить свою проблему 🙂

  1. Вам не нужно отделяться в двух списках. Попробуйте сделать это в одном классе

Добавить класс

 class FragmentHolder{ Fragment fragment; String title; public FragmentHolder(Fragment fragmentm String title){ this.fragment = fragment; this.title = title; } } 

И в адаптере

 public class TabsAdapter extends FragmentPagerAdapter{ private final List<FragmentHolder> mFragmentList = new ArrayList<>(); public TabsAdapter(FragmentManager fm) { super(fm); } public void addFrag(FragmentHolder fragmentHolder){ mFragmentList.add(fragmentHolder); } @Override public Fragment getItem(int position) { return mFragmentList.get(position).fragment; } @Override public int getCount() { return mFragmentList.size(); } @Override public CharSequence getPageTitle(int position) { return mFragmentTitleList.get(position).title; } } 

Прежде всего, вы должны знать, как работает FragmentPageAdaper. FragmentPagerAdapter создает два (2) фрагмента при запуске, Первый индекс (0) Фрагмент и Второй следующий индекс (1) Фрагмент. Поэтому не пытайтесь бороться с кодом, просто измените свой логин в соответствии с работой FragmentPageAdapter по умолчанию.

1) добавьте эту строку в действие

 viewPager.setOffscreenPageLimit("your number of fragment"); 

2) добавьте это в свой фрагмент, чтобы вы могли контролировать действие фрагмента, когда пользователь переключался между страницами

  // pause video and other list when user switch fragment pager public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (this.isVisible()) { if (!isVisibleToUser) // If we are becoming invisible, then... { mPlayer.pause(); final SharedPreferences.Editor editor= pref.edit(); editor.putBoolean("PlayerPause", true); editor.putInt("videotime",mPlayer.getCurrentTimeMillis()); editor.commit(); Log.e("Video "," serUserVisibleHint not visible to User");//pause or stop video } if (isVisibleToUser) // If we are becoming visible, then... { Log.e("Video "," serUserVisibleHint Visible to User"); //play your video } } } 

@ Riptyde4, то, что я сделал, это просто изменить класс, который расширяется TabsAdapter от FragmentPagerAdapter до FragmentStatePagerAdapter, который позволяет обнаруживать различные изменения состояния в viewPager. Я сделал это, и он отлично работает.