4

所以我试图让我的主导航栏下面的标签栏和布局工作在我的主要活动上。Android ViewPager加载不正确的碎片

我似乎无法得到ViewPager/TabLayout(不确定哪个是问题的原因,这是新的)加载正确的片段。我已经阅读了大量的文档,并检查了一个以上的教程,看看我是否正确地做了这件事,看起来我正在做同样的事情,他们是...

OnTabSelectedListener我的TabLayout看到该选项卡更改正确,并在OnTabSelected即时通话viewPager.setCurrentItem(tab.getPosition())尝试设置我的视图项目,但它仍然无法正常工作。在第一次加载时,它会加载第一个和第二个标签(我可以通过从onCreate方法的片段发送的API请求来看到),并且当我点击其他标签时,它会一直加载错误的片段,有时甚至不会加载一个!

不知道这是否是相关的,但我切换标签我得到这样的警告:

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); 
    } 
} 

的代码,这是我如何设置我的viewpager和tablayout

MainActivity的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); 
} 

如果有人看到什么不对的请让我知道,我不能为我的生命得到这些该死的标签加载正确的片段。

提前致谢!

+0

您是否调试过onTabUnselected和onTabReselected回调?他们工作正常吗? – IgorB

+0

@IgorB我会检查 – Riptyde4

+0

@IgorB unselected正在工作,但似乎重新选择没有被调用 – Riptyde4

回答

6

与此代码队友尝试: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) { 

     } 
    }); 

希望你能解决您的问题:)

+0

谢谢!这是工作... – Riptyde4

1
  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; 
    } 
} 
+0

好的谢谢,但没有帮助的问题:( – Riptyde4

+0

好吧,让我们想想更多:) – IgorB

1

所有你必须知道如何如何FragmentPageAdaper工作的第一位。 FragmentPagerAdapter在开始,第一个索引(0)片段和第二个下一个索引(1)片段实例化两个(2)片段。 所以不要试图与代码对抗,只需根据默认的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 
      } 
     } 
    } 
0

@ Riptyde4,之间的用户切换只是将由TabsAdapter扩展的类从FragmentPagerAdapter更改为FragmentStatePagerAdapter它允许viewPager中的不同状态更改为检测。我做到了这一点,它完美的作品。