【问题标题】:While using View Pager inside View Pager , not showing item of child view pager在 View Pager 中使用 View Pager 时,不显示子视图寻呼机的项目
【发布时间】:2019-04-05 06:08:45
【问题描述】:

在我的应用程序父视图寻呼机中有 5 个片段,其中 2 个在其中使用第二个视图寻呼机,其中包含另外 5 个片段。对于导航在父视图寻呼机中,我使用的是底部导航。在子导航中,我使用的是 Tab 布局。

问题是所有视图,除了子视图分页器的视图显示在父视图分页器中。https://ibb.co/2ScB3N6

我注意到,如果子视图寻呼机的项目在到达最后一项后显示。例如,如果我到达最后一个项目,那么如果我进入第二个项目,那么它就会显示出来。https://ibb.co/jLdT9Zf

另外,如果我将项目(其中有视图寻呼机)的位置更改为第一个,那么当当时盯着我看时,我只会显示它的项目,但是当我将父视图寻呼机的项目更改为第二个然后转到第一个然后会出现同样的问题。

父视图分页适配器代码:

public class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }
    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment) {
        mFragmentList.add(fragment);
    }

    @Override
    public int getItemPosition(Object object) {
        // POSITION_NONE makes it possible to reload the PagerAdapter
        return POSITION_NONE;
    }
}

所有与Parent viewpager Initialization相关的方法:

//************--设置视图寻呼机--********************* 调用 BottomNavigationmethod() 和 viewPagerMethod() 进入 onCreate

   private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        home=new Home();
        home.setArguments(HomeBundle);
        speed=new Speed();
        speed.setArguments(HomeBundle);
        rpm=new Rpm();
        rpm.setArguments(HomeBundle);
        spdRpm=new SpdRpm();
        spdRpm.setArguments(HomeBundle);
        dataRecord=new DataRecord();

        adapter.addFragment(home);
        adapter.addFragment(rpm);
        adapter.addFragment(dataRecord);
        adapter.addFragment(spdRpm);
        adapter.addFragment(speed);
        viewPager.setAdapter(adapter);
    }

//***************--底部导航方式--****************

    public void BottomNavigationmethod(){
        bottomNavigationView.setOnNavigationItemSelectedListener(
                new BottomNavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.action_home:
                                viewPager.setCurrentItem(0);

                                break;

                            case R.id.action_rpm:
                                viewPager.setCurrentItem(1);


                                break;
                            case R.id.action_dataRecord:
                                viewPager.setCurrentItem(2);


                                break;
                            case R.id.action_spdRpm:
                                viewPager.setCurrentItem(3);


                                break;
                            case R.id.action_speed:
                                viewPager.setCurrentItem(4);
                                break;

                        }
                        return false;
                    }
                });
    }

//****************--查看Pager方法--******

  public void viewPagerMethod(){

        GetCurrentItem=String.valueOf(viewPager.getCurrentItem());

        Log.d("getcurrntinside",GetCurrentItem);
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }


            @Override
            public void onPageSelected(int position) {
//                viewPager.getAdapter().notifyDataSetChanged();
                if (prevMenuItem != null) {
                    prevMenuItem.setChecked(false);
                }
                else
                {
                    bottomNavigationView.getMenu().getItem(0).setChecked(true);
                }    
                Position=String.valueOf(position);
                bottomNavigationView.getMenu().getItem(position).setChecked(true);
                prevMenuItem = bottomNavigationView.getMenu().getItem(position);

                OnViewPager=String.valueOf(bottomNavigationView.getMenu().getItem(position));


            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        setupViewPager(viewPager);
    }

菜单 xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_home"
        android:checked="true"
        android:icon="@drawable/cartab"
        android:title="@string/HomeTab"
        app:showAsAction="always" />
    <item
        android:id="@+id/action_rpm"
        android:checked="false"
        android:icon="@drawable/rpmtab"
        android:title="@string/RpmTab"
        app:showAsAction="always" />


    <item
        android:id="@+id/action_dataRecord"
        android:checked="false"
        android:icon="@drawable/rpmtab"
        android:title="@string/DataRecordTab"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_spdRpm"
        android:checked="false"
        android:icon="@drawable/spdrpmtab"
        android:title="@string/SpeedRpmTab"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_speed"
        android:checked="false"
        android:icon="@drawable/speedtab"
        android:title="@string/SpeedTab"
        app:showAsAction="always" />

</menu>

子视图分页器的视图分页器适配器:

public class ViewpageAdapterFrg extends FragmentPagerAdapter {
    public List<Fragment> fragmentList=new ArrayList<>();
    public List<String> fragmentTittle=new ArrayList<>();


    public ViewpageAdapterFrg(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getCount() {
        return fragmentTittle.size();
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return fragmentTittle.get(position);
    }

    public void fragmentAdd(Fragment fragment, String text){
       fragmentList.add(fragment);
       fragmentTittle.add(text);
    }
    @Override
    public int getItemPosition(Object object) {
        // POSITION_NONE makes it possible to reload the PagerAdapter
        return POSITION_NONE;
    }
}

子视图分页器相关方法: 在创建时调用此方法

public void apptabview(){
    tabLayout=(TabLayout)view.findViewById(R.id.tabs);
    viewPager=(ViewPager)view.findViewById(R.id.viewpage);

    ViewpageAdapterFrg FirstAdapter=new ViewpageAdapterFrg(getActivity().getSupportFragmentManager());

    FirstAdapter.fragmentAdd(new NormalRpmFragment(),"Normal");
    FirstAdapter.fragmentAdd(new AwesomeRpmFragment(),"Awesome");
    FirstAdapter.fragmentAdd(new PointerRpmFragment(),"Pointer");
    FirstAdapter.fragmentAdd(new ProgressRpmFragment(),"Pointer");
    FirstAdapter.fragmentAdd(new DeluxeRpmFragment(),"Deluxe");

    viewPager.setAdapter(FirstAdapter);

    Log.d("speedViewFragemnt",String.valueOf(viewPager.getCurrentItem()));
    tabLayout.setupWithViewPager(viewPager);
}

我在子视图寻呼机的 addOnPagerListen 的各种事件中尝试了 viewpager.getAdapter.notifyDatasetChanges() 但它冻结了应用程序。

【问题讨论】:

    标签: android android-fragments navigation android-viewpager


    【解决方案1】:
     getChildFragmentManager()
    

    返回一个私有的 FragmentManager,用于在 Fragment 中放置和管理 Fragment。

     getSupportFragmentManager()
    

    返回 FragmentManager 以与与此片段的活动关联的片段进行交互。

    在您与子视图寻呼机相关的方法中

    ViewpageAdapterFrg FirstAdapter=new ViewpageAdapterFrg(getChildFragmentManager());
    
    FirstAdapter.fragmentAdd(new NormalRpmFragment(),"Normal");
    FirstAdapter.fragmentAdd(new AwesomeRpmFragment(),"Awesome");
    FirstAdapter.fragmentAdd(new PointerRpmFragment(),"Pointer");
    FirstAdapter.fragmentAdd(new ProgressRpmFragment(),"Pointer");
    FirstAdapter.fragmentAdd(new DeluxeRpmFragment(),"Deluxe");
    
    viewPager.setAdapter(FirstAdapter);
    
    Log.d("speedViewFragemnt",String.valueOf(viewPager.getCurrentItem()));
    tabLayout.setupWithViewPager(viewPager);
    

    【讨论】:

    • getActivty() 在片段中使用时是必需的。除了你的代码有什么不同
    • 您在 Fragment 内使用视图寻呼机,因此您需要使用 getChildFragmentManager() 而不是 getActivity().getSupportFragmentManager()
    • 尝试ViewpageAdapterFrg FirstAdapter=new ViewpageAdapterFrg(this.getChildFragmentManager()); ,以防getChildFragmentManager() 无法解析或引用
    • 不太可能 getSupportFragmentManager() , getChildFragmentManager() 甚至不需要其片段的上下文。所以简单地 getChildFragmentManager() 工作
    • 太棒了!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多