Android ViewPager正在加载不正确的片段

Android ViewPager正在加载不正确的片段,android,android-layout,android-fragments,android-viewpager,android-tablayout,Android,Android Layout,Android Fragments,Android Viewpager,Android Tablayout,因此,我试图在我的主导航栏下获得一个选项卡栏和布局,以处理我的主要活动 我似乎无法让ViewPager/TabLayout(不确定是什么原因导致了问题,这是新的)加载正确的片段。我已经阅读了大量的文档,检查了不止一个教程,看看我是否做得正确,看起来我做的和他们一样 myTableLayout的OnAbsSelectedListener看到选项卡正确更改,在OnAbsSelected中,我调用viewPager.setCurrentItem(tab.getPosition())尝试设置我的view

因此,我试图在我的主导航栏下获得一个选项卡栏和布局,以处理我的主要活动

我似乎无法让ViewPager/TabLayout(不确定是什么原因导致了问题,这是新的)加载正确的片段。我已经阅读了大量的文档,检查了不止一个教程,看看我是否做得正确,看起来我做的和他们一样

my
TableLayout
OnAbsSelectedListener
看到选项卡正确更改,在
OnAbsSelected
中,我调用
viewPager.setCurrentItem(tab.getPosition())
尝试设置我的viewpagers项目,但它仍然不起作用。在第一次加载时,它加载第一个和第二个选项卡(我可以通过fragments onCreate方法发送的API请求看到),当我单击其他选项卡时,它始终加载错误的片段,有时甚至根本不加载一个

不确定这是否相关,但我在切换选项卡时收到此警告:

03-03 16:24:22.940 16967-16967/com.sampleapp.app W/FragmentManager:moveToState:BlankFragment3的片段状态{efddbec#2 id=0x7f0c007b android:switcher:2131492987:2}未在线更新;预期状态3已找到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"?>
最后是我的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);
}
如果有人认为这有什么问题,请告诉我,我不能让这些该死的标签加载正确的片段

提前谢谢

  • 您不需要在两个列表视图中分开。试着在一节课上做
  • 添加类

    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;
        }
    }
    
    公共类TabsAdapter扩展了FragmentPagerAdapter{
    私有最终列表MFFragmentList=new ArrayList();
    公共选项卡适配器(碎片管理器fm){
    超级(fm);
    }
    公共无效添加碎片(碎片持有人碎片持有人){
    MFFragmentList.add(碎片持有者);
    }
    @凌驾
    公共片段getItem(int位置){
    返回mffragmentlist.get(position.fragment);
    }
    @凌驾
    public int getCount(){
    返回MFFragmentList.size();
    }
    @凌驾
    公共字符序列getPageTitle(int位置){
    返回MFFragmentTitleList.get(position.title);
    }
    }
    
    尝试使用此代码匹配:D

    可视寻呼机适配器

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

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

    首先,您必须了解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,我所做的只是将选项卡Adapter扩展的类从FragmentPagerAdapter更改为FragmentStatePagerAdapter,从而允许检测viewPager中的不同状态更改。我这样做了,效果很好。

    您调试了ontabonselected和onTabReselected的回调吗?它们工作正常吗?@IgorB unselected正在工作,但似乎在本教程中没有调用reselected。他们使用FragmentStatePagerAdapter,你试过了吗?我编辑了我的评论:)参考这个答案
     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) {
    
            }
        });
    
    viewPager.setOffscreenPageLimit("your number of fragment"); 
    
      // 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
                }
            }
        }