Actualizar fragmento al recargar


110

En una aplicación de Android, estoy cargando datos de un Db en un TableViewarchivo Fragment. Pero cuando recargo Fragment, muestra los datos anteriores. ¿Puedo volver a completar el Fragmentcon datos actuales en lugar de datos anteriores?


muéstranos un código por favor. ¿Dónde carga sus datos, dónde comienza su fragmento, dónde almacena sus valores?
— AS el

Esto debería resolver su problema descrito detalladamente: stackoverflow.com/questions/6503189/…
— Benjamin W.

Proporcione más fragmento de código de información
— Nikvs

Intente usar Swipe-to-Refresh To Your App vea esto stackoverflow.com/questions/41469040/fragment-refresh/…
— Imtiaz Mamun

Respuestas:


207

Creo que desea actualizar el contenido del fragmento al actualizar la base de datos

Si es así, separe el fragmento y vuelva a colocarlo.

// Reload current fragment
Fragment frg = null;
frg = getSupportFragmentManager().findFragmentByTag("Your_Fragment_TAG");
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.detach(frg);
ft.attach(frg);
ft.commit();

Your_Fragment_TAG es el nombre que le dio a su fragmento cuando lo creó

Este código es para la biblioteca de soporte.

Si no es compatible con dispositivos más antiguos, use getFragmentManager en lugar de getSupportFragmentManager

[EDITAR]

Este método requiere que el Fragmento tenga una etiqueta.
En caso de que no lo tenga, entonces el método de @ Hammer es lo que necesita.


3
Esto da el siguiente error: java.lang.RuntimeException: Error al entregar el resultado ResultInfo {quién = nulo, solicitud = 2, resultado = 3, datos = nulo} a la actividad {xont.virtusel.v4.controller / xont.virtusel.v4.controller .sale.InvocieBrandActivity}: java.lang.IllegalStateException: no se puede realizar esta acción después de onSaveInstanceState
— Samantha Withanage

1
@Elizabeth asegúrese de que su Fragmento tenga una etiqueta configurada correctamente
— Phantômaxx

1
@Rotwang Gracias por su respuesta, tomé un atajo en lugar de hacer el código largo, pero eso ayudó a
— allanar

1
Esta solución ya no funciona en la nueva versión de support-v4-library (25.1.0). Explicación aquí: stackoverflow.com/questions/41270858/…
— Brahim Bouaboud

1
Advertencia: ¡este truco funciona en Oreo solo si está utilizando fragmentos de soporte!
— racs

146

Esto actualizará el fragmento actual:

FragmentTransaction ft = getFragmentManager().beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
   ft.setReorderingAllowed(false);
}
ft.detach(this).attach(this).commit();

1
donde poner este codigo? actividad interior o fragmento en sí mismo?
— Narendra Singh

2
Lo pones dentro del fragmento que necesita ser actualizado.
— Mbengue Assane

1
@SagarChavada ¿dónde pusiste el código? Tienes que ponerlo en un evento único, como cuando se actualizan los datos.
— Mbengue Assane

5
Recursividad, la recursividad, un sinfín de llamadas
— sha Zulkarnain

2
Usar esto crea dentro de onResume en el fragmento hace un bucle, ¿cómo evitarlo?
— Soul

32

En caso de que no tenga la etiqueta de fragmento, el siguiente código funciona bien para mí.

Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
if (currentFragment instanceof "NAME OF YOUR FRAGMENT CLASS") {
 FragmentTransaction fragTransaction =   (getActivity()).getFragmentManager().beginTransaction();
 fragTransaction.detach(currentFragment);
 fragTransaction.attach(currentFragment);
 fragTransaction.commit();}
}

1
cuál será la identificación del fragmento, no he declarado la identificación del fragmento en ninguna parte. ¿Cómo y dónde declararlo?
— Narendra Singh

Parece que no puedo usar getActivity()en mi actividad. ¿Debería usar Activity.this...?
— Si8

@NarendraJi es el ID de FrameLayout solo que es donde coloca sus fragmentos en el contenedor.
— Lokesh

Quite esa abrazadera adicional. Me causó muchos problemas.
— Abhishek

9

Puede actualizar su fragmento cuando sea visible para el usuario, simplemente agregue este código en su Fragmento, esto actualizará su fragmento cuando esté visible.

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // Refresh your fragment here          
  getFragmentManager().beginTransaction().detach(this).attach(this).commit();
        Log.i("IsRefresh", "Yes");
    }
}

tan lento que toma 3 segundos hasta que se
— recarga

Esto parece funcionar bien con el adaptador de
— visor

2
setUserVisibleHint está obsoleto
— Sai Aditya

Funcionó para mí, gracias por la solución.
— hetsgandhi

7

Para actualizar el fragmento, la respuesta aceptada no funcionará en Nougat y la versión superior. Para que funcione en todos los sistemas operativos, puede hacer lo siguiente.

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        fragmentManager.beginTransaction().detach(this).commitNow();
        fragmentManager.beginTransaction().attach(this).commitNow();
    } else {
        fragmentManager.beginTransaction().detach(this).attach(this).commit();
    }

5

No puede volver a cargar el fragmento mientras está adjunto a una actividad, donde obtiene una " Fragment Already Added" excepción.

Por lo tanto, el fragmento debe separarse primero de su actividad y luego unirse. Todo se puede hacer usando la api fluida en una línea:

getFragmentManager().beginTransaction().detach(this).attach(this).commit();

Actualización: Esto es para incorporar los cambios realizados en API 26 y superior:

FragmentTransaction transaction = mActivity.getFragmentManager()
                        .beginTransaction();
                if (Build.VERSION.SDK_INT >= 26) {
                    transaction.setReorderingAllowed(false);
                }
                transaction.detach(this).attach
                        (this).commit();

Para obtener más descripción de la actualización, consulte https://stackoverflow.com/a/51327440/4514796


2
Proporcione su respuesta con descripciones claras. No escriba el código, dé la explicación sobre el código que ha compartido, para que otros también puedan entenderlo y será útil. Le solicito que lea la sección de preguntas frecuentes para usar Stack Overflow de manera efectiva.
— Sankar Ganesh

3
   MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
        getSupportFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit();

esto solo funcionará si usas FragmentManagerpara inicializar el fragmento. Si lo tiene como <fragment ... />en XML, no volverá a llamar onCreateView. Perdí mis 30 minutos para resolver esto.


1

Aquí lo que hice y funcionó para mí, uso firebase y cuando el usuario inicia sesión, quería actualizar el Fragmento actual primero, necesitará el contexto de la actividad porque el fragmento no tiene una forma de obtener el contexto a menos que lo configure desde Actividad o contexto aquí es el código que usé y trabajé en el lenguaje kotlin, creo que podrías usar el mismo en la clase java

   override fun setUserVisibleHint(isVisibleToUser: Boolean) {
    super.setUserVisibleHint(isVisibleToUser)
    val context = requireActivity()
    if (auth.currentUser != null) {
        if (isVisibleToUser){
            context.supportFragmentManager.beginTransaction().detach(this).attach(this).commit()
        }
    }

}

0

Use ContentProvideray cargue sus datos usando un 'CursorLoader'. Con esta arquitectura, sus datos se volverán a cargar automáticamente en los cambios de la base de datos. Use frameworks de terceros para su ContentProvider- realmente no quiere implementarlo usted mismo ...


0

Tuve el mismo problema, pero ninguno de los anteriores funcionó para el mío. o hubo un problema de backstack (después de cargar cuando el usuario presionó hacia atrás, volvería a usar el mismo fragmento) o no llamó alonCreaetView

finalmente hice esto:

public void transactFragment(Fragment fragment, boolean reload) {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    if (reload) {
        getSupportFragmentManager().popBackStack();
    }
    transaction.replace(R.id.main_activity_frame_layout, fragment);
    transaction.addToBackStack(null);
    transaction.commit();
}

El buen punto es que tampoco necesita la etiqueta o la identificación del fragmento. si quieres recargar


0

Utilice el método onResume ... tanto en la actividad del fragmento como en la actividad que contiene el fragmento.


0
getActivity().getSupportFragmentManager().beginTransaction().replace(GeneralInfo.this.getId(), new GeneralInfo()).commit();

GeneralInfo es mi clase de Fragmento GeneralInfo.java

Lo puse como método en la clase de fragmento:

public void Reload(){
    getActivity().getSupportFragmentManager().beginTransaction().replace(LogActivity.this.getId(), new LogActivity()).commit();
}

-2
protected void onResume() {
        super.onResume();
        viewPagerAdapter.notifyDataSetChanged();
    }

Escriba viewpagerAdapter.notifyDataSetChanged (); en onResume () en MainActivity. Buena suerte :)


-2

La manera más fácil

hacer un método estático público que contenga viewpager.setAdapter

hacer que el adaptador y el visor estén estáticos

public static void refreshFragments(){
        viewPager.setAdapter(adapter);
    }

llamar a cualquier lugar, cualquier actividad, cualquier fragmento.

MainActivity.refreshFragments();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.