在 View Pager 中使用 View Pager 时,不显示 child view pager 的项目
While using View Pager inside View Pager , not showing item of child view pager
在我的应用程序中 parent 视图寻呼机有 5 个片段,其中 2 个使用其中包含另外 5 个片段的第二个视图寻呼机。对于导航 在 Parent 视图寻呼机中,我使用底部导航。在 child 导航中,我使用的是 Tab 布局。
问题是所有视图,除了 child view pager 的视图显示在 parent viewpager 中。https://ibb.co/2ScB3N6
我注意到如果 child 查看寻呼机的项目在到达最后一个项目后显示。例如,如果我到达最后一个项目,然后如果我转到第二个项目,那么它就会显示。https://ibb.co/jLdT9Zf
此外,如果我将项目(里面有查看寻呼机)的位置更改为第一个,那么当当时盯着看时,我只显示它的项目,但是当我将 parent 的查看寻呼机的项目更改为第二个时,然后转到首先发生同样的问题。
Parent 查看寻呼机适配器的代码:
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;
}
}
与Parentviewpager初始化相关的所有方法:
//************--设置视图寻呼机--*********************
将 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>
child 查看寻呼机的查看寻呼机适配器:
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;
}
}
与child查看寻呼机相关的方法:
在 create
上调用此方法
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);
}
我在 child 查看寻呼机的 addOnPagerListen 的各种事件中尝试了 viewpager.getAdapter.notifyDatasetChanges() 但它冻结了应用程序。
getChildFragmentManager()
Returns 一个私有的 FragmentManager,用于在 Fragment 中放置和管理 Fragment。
getSupportFragmentManager()
Returns FragmentManager 用于与与此片段的 activity.
关联的片段进行交互
在你的方法中与子视图寻呼机相关
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);
在我的应用程序中 parent 视图寻呼机有 5 个片段,其中 2 个使用其中包含另外 5 个片段的第二个视图寻呼机。对于导航 在 Parent 视图寻呼机中,我使用底部导航。在 child 导航中,我使用的是 Tab 布局。
问题是所有视图,除了 child view pager 的视图显示在 parent viewpager 中。https://ibb.co/2ScB3N6
我注意到如果 child 查看寻呼机的项目在到达最后一个项目后显示。例如,如果我到达最后一个项目,然后如果我转到第二个项目,那么它就会显示。https://ibb.co/jLdT9Zf
此外,如果我将项目(里面有查看寻呼机)的位置更改为第一个,那么当当时盯着看时,我只显示它的项目,但是当我将 parent 的查看寻呼机的项目更改为第二个时,然后转到首先发生同样的问题。
Parent 查看寻呼机适配器的代码:
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;
}
}
与Parentviewpager初始化相关的所有方法:
//************--设置视图寻呼机--********************* 将 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>
child 查看寻呼机的查看寻呼机适配器:
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;
}
}
与child查看寻呼机相关的方法: 在 create
上调用此方法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);
}
我在 child 查看寻呼机的 addOnPagerListen 的各种事件中尝试了 viewpager.getAdapter.notifyDatasetChanges() 但它冻结了应用程序。
getChildFragmentManager()
Returns 一个私有的 FragmentManager,用于在 Fragment 中放置和管理 Fragment。
getSupportFragmentManager()
Returns FragmentManager 用于与与此片段的 activity.
关联的片段进行交互在你的方法中与子视图寻呼机相关
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);