【问题标题】:Fragments not updating ViewPageAdapter片段不更新 ViewPager 适配器
【发布时间】:2018-10-19 01:13:27
【问题描述】:

目前,我正在做一个项目,我已经实现了一个 viewPager 和一个底部导航视图来更改片段。我也可以左右滑动来改变片段。

当我单击导航视图上的某个项目时,片段会变为附加片段。我的底部导航视图是这样设置的:

这个问题很难解释,但这是我的尝试:

片段仅在我进入片段“主页”后更新。

这意味着,当我在“主页”之后单击“Oversigt”时,片段“Oversigt”将更新它的视图。但是,如果我不在“主页”中,并且不在其他片段中,则单击片段“Oversigt”。然后“Oversigt”不会更新它的视图。

我的主要活动:

public void setViewPager(int fragmentNumber) {

    mPager.setCurrentItem( fragmentNumber );

}

public void enableViewPagerSwitch() {

    mPager.addOnPageChangeListener( new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {

            if (prevMenuItem != null) {
                prevMenuItem.setChecked( false );
            } else {
                mBottomNav.getMenu().getItem( 0 ).setChecked( false );
                navigationView.getMenu().getItem( 0 ).setChecked( false );

            }
            Log.d( "page", "onPageSelected: " + position );

            mBottomNav.getMenu().getItem( position ).setChecked( true );
            navigationView.getMenu().getItem( position ).setChecked( true );

            prevMenuItem = mBottomNav.getMenu().getItem( position );
            prevMenuItem = navigationView.getMenu().getItem( position );

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    } );

    setupViewPager( mPager );

}


public void bot_Navigation() {

    mBottomNav = (BottomNavigationView) findViewById( R.id.nav_bot );

    botNavHelper.disableShiftMode( mBottomNav );

    mBottomNav.setOnNavigationItemSelectedListener( new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()) {

                case R.id.bot_startside:
                    setViewPager( 0 );
                    break;

                case R.id.bot_datatabel:
                    setViewPager( 1 );
                    break;

                case R.id.bot_sensorOversigt:
                    setViewPager( 2 );
                    break;

                case R.id.bot_kontakt:
                    setViewPager( 3 );
                    break;

                case R.id.bot_logUd:
                    setViewPager( 4 );
                    alertDialog();
                    break;
            }

            return true;
        }
    } );

}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate( savedInstanceState );

    onCreate2();

    bot_Navigation();

}

protected void onCreate2() {

    setContentView( R.layout.activity_main );
    Toolbar toolbar = (Toolbar) findViewById( R.id.toolbar );
    setSupportActionBar( toolbar );

    TextView mTitle = (TextView) toolbar.findViewById( R.id.toolbartitle );

    mTitle.setText( toolbar.getTitle() );

    getSupportActionBar().setDisplayShowTitleEnabled( false );

    mPager = (ViewPager) findViewById( R.id.flMain );

    enableViewPagerSwitch();

    DrawerLayout drawer = (DrawerLayout) findViewById( R.id.drawer_layout );
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close );
    drawer.addDrawerListener( toggle );
    toggle.syncState();

    navigationView = (NavigationView) findViewById( R.id.nav_view );
    navigationView.setNavigationItemSelectedListener( this );

    navigationView.setCheckedItem( R.id.nav_startside );

}

这是 ViewPageAdapter:

public class ViewPageAdapter extends FragmentStatePagerAdapter {

private final List<Fragment> mFragmentList = new ArrayList<>();

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

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

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

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

}

【问题讨论】:

    标签: android android-fragments android-viewpager


    【解决方案1】:

    使用 SmartFragmentStatePagerAdapter

    public abstract class SmartFragmentStatePagerAdapter extends FragmentStatePagerAdapter implements Serializable {
        // Sparse array to keep track of registered fragments in memory
        private SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
    
        public SmartFragmentStatePagerAdapter(FragmentManager fragmentManager) {
            super(fragmentManager);
        }
    
        // Register the fragment when the item is instantiated
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Fragment fragment = (Fragment) super.instantiateItem(container, position);
            registeredFragments.put(position, fragment);
            return fragment;
        }
    
        // Unregister when the item is inactive
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            registeredFragments.remove(position);
            super.destroyItem(container, position, object);
        }
    
        // Returns the fragment for the position (if instantiated)
        public Fragment getRegisteredFragment(int position) {
            return registeredFragments.get(position);
        }
    

    根据您创建这些片段的位置,您可能想尝试使用getChildFragmentManager。另一种方法是使用https://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter

    【讨论】:

    • 感谢您的回答!你能解释一下怎么做吗?
    • 这个类重写了 instantiateItem() 方法并在内部缓存所有创建的片段。然后您的 pagerAdapter 可以扩展 SmartFragmentStatePagerAdapter。然后在您的主要片段中,您可以使用myPagerAdapter.instantiateItem(); 创建各个片段
    • 好的,到目前为止,我已经将我的 PageAdapter 扩展到 SmartFragmentStatePagerAdapter。现在我不确定在哪里实现: mPagerAdapter.instantiateItem(); -> 我应该在我的导航视图中实现吗?
    • 应该在要显示它的视图中。所以无论你在哪里创建片段,它都可以在那里替换它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多