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?

Samantha Withanage
fuente
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.

Phantômaxx
fuente
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();
Mbengue Assane
fuente
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();}
}
Martillo
fuente
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");
    }
}
Kaushik Khambhadiya
fuente
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();
    }
Sachin Jagtap
fuente
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

Ali Nem
fuente
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.

Irshu
fuente
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()
        }
    }

}
hardiBSalih
fuente
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 ...

artkoenig
fuente
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

Emad
fuente
0

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

Mwangi Gituathi
fuente
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();
}
Brayan Steven Martínez Vanegas
fuente
-2
protected void onResume() {
        super.onResume();
        viewPagerAdapter.notifyDataSetChanged();
    }

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

Handy Kim
fuente
-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();
ryan christoper lucasan
fuente