Reemplazar fragmento con otro fragmento dentro de ViewPager

Estoy usando un ViewPager junto con un FragmentPagerAdapter para alojar tres fragmentos diferentes

[Fragment1][Fragment2][Fragment3]

Lo que estoy tratando de lograr es reemplazar con éxito Fragment1 con un fragmento completamente nuevo, Fragment4, si una tarea específica tiene éxito.

Cuando uso ..

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.fragment1_layout_id, fragment4);
transaction.commit();

.. el fragmento se reemplaza maravillosamente y se muestra Fragment4 en lugar de Fragment1. Aunque tan pronto como deslizo hasta Fragment3 y luego de regreso a Fragment4, Fragment1 ha regresado.

Luego, de nuevo, si uso ..

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.remove(fragment1);
transaction.commit();

.. Fragment1 se elimina y cuando regreso Fragment4 está allí. Entonces, el problema con esta solución es que no pude encontrar una manera de mostrar inmediatamente Fragment4 a medida que se elimina Fragment1, incluso si intenté:

transaction.add(fragment4);
transaction.show(fragment4);

Y así es como se ve mi implementación de FragmentPagerAdapter en este momento,sin ninguna gestión de transacciones:

public static class PagerAdapter extends FragmentPagerAdapter {

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

    @Override
    public int getCount() {
        return VIEW_COUNT;
    }

    @Override
    public Fragment getItem(int position) {

        Fragment fragment = null;

        switch (position) {
        case 0:
            fragment = Fragment1.newInstance(context_);
            break;

        case 1:
            fragment = Fragment2.newInstance(context_);
            break;

        case 2:
            fragment = Fragment3.newInstance(context_);
            break;

        default:
            break;
        }

        return fragment;
    }
}

Editar

Así que parece que no estaba totalmente claro con mi pregunta. Decidí eliminar todos los espaguetis que logré crear antes e intenté decir que los había dejado (ver el texto en negrita arriba).

e todos modos, aquí es más o menos lo que he estado tratando de hacer dentro de getItem ():

@Override
public Fragment getItem(int position) {

    Fragment fragment = null;

    switch (position) {
    case 0:

        if (!app.isUserLoggedIn) {
            if (loginFragment_ == null) {
                loginFragment_ = LoginFragment.newInstance(context_);
                transaction_ = fragmentManager_.beginTransaction();

                if (logoutFragment_ != null) {
                    transaction_.remove(logoutFragment_);
                    logoutFragment_ = null;
                }

                transaction_.add(loginFragment_, "login");
                transaction_.commit();
            }

            if (fragmentManager_.findFragmentByTag("login") == null)
                fragment = LoginFragment.newInstance(context_);
            else
                fragment = fragmentManager_.findFragmentByTag("login");

        } else {
            if (logoutFragment_ == null) {                      
                logoutFragment_ = LogoutFragment.newInstance(context_);
                transaction_ = fragmentManager_.beginTransaction();

                if (loginFragment_ != null) {
                    transaction_.remove(loginFragment_);
                    loginFragment_ = null;
                }

                transaction_.add(logoutFragment_, "logout");
                transaction_.commit();
            }

            if (fragmentManager_.findFragmentByTag("logout") == null)
                fragment = LogoutFragment.newInstance(context_);
            else
                fragment = fragmentManager_.findFragmentByTag("logout");
        }
        break;

    case 1:
        fragment = HomeFragment.newInstance(context_);
        break;

    case 2:
        fragment = RegisterFragment.newInstance(context_);
        break;

    default:
        break;
    }

    return fragment;
}

Con este código no hago nada, pero si alguien ve lo que estoy haciendo mal y me gustaría señalarme en la dirección correcta, ¡lo agradecería mucho!

Respuestas a la pregunta(6)

Su respuesta a la pregunta