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中的不同狀態更改爲檢測。我做到了這一點,它完美的作品。