Фрагменты не обновляют ViewPageAdapter - PullRequest
0 голосов
/ 18 октября 2018

В настоящее время я работаю над проектом, в котором реализовал viewPager и нижний навигационный вид для изменения фрагментов.Также я могу провести пальцем влево и вправо, чтобы изменить фрагменты.

Когда я нажимаю на элемент в навигационном представлении, фрагмент изменяется на прикрепленный фрагмент.Мой нижний вид навигации настроен так:

enter image description here

Проблема трудно объяснить, но это моя попытка:

Фрагменты обновляются только ПОСЛЕ того, как я был во фрагменте «Домой».

Это означает, что при нажатии на "Oversigt" после того, как я был в "Home", фрагмент "Oversigt" обновит свои представления.Но если я не в «Доме», а в одном из других фрагментов, и я нажимаю на фрагмент «Оверсигт».Тогда "Oversigt" не будет обновлять свои взгляды.

My MainActivity:

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

}

1 Ответ

0 голосов
/ 18 октября 2018

Используйте 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

...