Fragmentos que no se vuelven a crear por FragmentStatePagerAdapter después de volver a la instancia de Fragmento principal

ALCANCE

Estoy haciendo una solicitud para mi fiesta de la universidad que muestra los eventos para 4 fechas fijas particulares. Tengo un main_activity que tiene un linearlayout en el cual cada fragmento se exhibe. Ahora tengo un fragmento " ScheduleFragment ".

ScheduleFragment consiste en un ViewPager y un FragmentStatePagerAdapter que hacen posible cambiar entre 4 fechas.

El ViewPager tiene 4 páginas que representan 4 fechas y estas 4 páginas vienen de 4 referencias de un mismo fragmento es decir " ScheduleListSubFragment "

Desde aquí un usuario selecciona un Evento y puede ver el eventDescription que está contenido en " EventDescriptionFragment "

PROBLEMA

El flujo va bien. El usuario se encuentra con ScheduleFragment, luego cambia a la fecha apropiada y selecciona un evento.

Ahora, cuando vuelve del EventDescriptionFragment a ScheduleFragment (más tarde voy a decir cómo estoy haciendo esto), ViewPager muestra la vista en blanco. Y cuando pasamos a la siguiente fecha, los eventos para la siguiente fecha viene, y volvemos a la fecha anterior, los eventos de la fecha anterior están de vuelta.

He depurado mi aplicación y he llegado a saber que cuando volvamos a ScheduleFragment , entonces viewpager no está creando nuevas instancias de fragmento para ScheduleListSubFragment a menos que desplace el viewpager.

Por lo tanto, supongo ViewPager es permitir traer esa referencia particular (de ScheduleListSubFragment ) que estaba siendo visto por el usuario.

¿Cómo voy a regresar a ScheduleFragment ? He creado una pila en main_activity. Cuando un usuario selecciona un evento, empujo la referencia actual de ScheduleFragment a la pila. Y cuando se pulsa, presiono esa referencia y la coloco en la pantalla.

CODE * ScheduleFragment * import com.Nit_kkr.updates.app.adapters.ScheduleFragmentAdapter; Import com.viewpagerindicator.PageIndicator; Import com.viewpagerindicator.TitlePageIndicator; Import com.viewpagerindicator.TitlePageIndicator.IndicatorStyle;

import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; public class ScheduleFragment extends Fragment{ ScheduleFragmentAdapter mAdapter; ViewPager mPager; PageIndicator mIndicator; TitlePageIndicator indicator; @Override public void onViewStateRestored(Bundle savedInstanceState) { // Toast.makeText(getActivity(), " onViewStateRestored()", Toast.LENGTH_SHORT).show(); super.onViewStateRestored(savedInstanceState); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mAdapter = new ScheduleFragmentAdapter(getActivity().getSupportFragmentManager()); mAdapter.notifyDataSetChanged(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.scheduled_list, null); prepareSlidingPager(v); return v; } private void prepareSlidingPager(View v) { mPager = (ViewPager)v.findViewById(R.id.pager); mPager.setOffscreenPageLimit(4); mPager.setAdapter(mAdapter); mIndicator = (TitlePageIndicator)v.findViewById(R.id.indicator); indicator = (TitlePageIndicator) mIndicator; mIndicator.setViewPager(mPager); final float density = getResources().getDisplayMetrics().density; indicator.setBackgroundColor(0x18AF0000); indicator.setFooterColor(0xFFAA2222); //indicator.setFooterColor(0xFFAA33); indicator.setFooterLineHeight(2 * density); //1dp indicator.setFooterIndicatorHeight(3 * density); //3dp indicator.setFooterIndicatorStyle(IndicatorStyle.Underline); indicator.setTextColor(0xAA000000); indicator.setSelectedColor(0xFF000000); indicator.setSelectedBold(true); } public static ScheduleFragment newInstance() { ScheduleFragment frag = new ScheduleFragment(); return frag; } } 

ScheduleListSubFragment:

  public class ScheduleListSubFragment extends Fragment implements OnItemClickListener{ long startDate; long endDate; private ListView eventlist; private listadapter adapter; private List events; private MyDB db; @Override public void onAttach(Activity activity) { Toast.makeText(getActivity(), " onAttatch()------------------sublist schedule", Toast.LENGTH_SHORT).show(); super.onAttach(activity); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); db=new MyDB(this.getActivity()); Toast.makeText(getActivity(), " onCreate()------------------sublist schedule", Toast.LENGTH_SHORT).show(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //Toast.makeText(getActivity(), " onCreateView()------------------sublist schedule", Toast.LENGTH_SHORT).show(); View v = inflater.inflate(R.layout.eventslist_subfragment_layout, null); eventlist=(ListView)v.findViewById(R.id.Event_list); eventlist.setOnItemClickListener(this); fetcheventdata(getArguments().getLong("start_time"), getArguments().getLong("end_time")); return v; } public static ScheduleListSubFragment newInstance(long starttime, long endtime) { ScheduleListSubFragment frag = new ScheduleListSubFragment(); Bundle bundle = new Bundle(); bundle.putLong("start_time", starttime); bundle.putLong("end_time", endtime); frag.setArguments(bundle); return frag; } private void fetcheventdata(long starttime, long endtime) { db.open(); events=db.getEvents_bycategory_bytime(null, starttime, endtime); db.close(); if(events!=null) { adapter=new listadapter(getActivity(), android.R.layout.simple_expandable_list_item_1, events); eventlist.setAdapter(adapter); adapter.notifyDataSetChanged(); } else Toast.makeText(getActivity(), "No Events Yet", Toast.LENGTH_LONG); //Toast.makeText(getActivity(), events.size(), Toast.LENGTH_LONG).show(); } private class listadapter extends ArrayAdapter<Event> { private List items; public listadapter(Context context, int textViewResourceId, List objects){ super(context, textViewResourceId, objects); items=new ArrayList(); items=objects; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v=convertView; if(v==null) { LayoutInflater vi=(LayoutInflater)getActivity().getSystemService(Activity.LAYOUT_INFLATER_SERVICE); v=vi.inflate(R.layout.upcominglist, null); } Event event=(Event)items.get(position); if(event!=null) { TextView name=(TextView)v.findViewById(R.id.Name); TextView venue=(TextView)v.findViewById(R.id.Venue); TextView time=(TextView)v.findViewById(R.id.time); name.setTypeface(Utils.getHeroFace(getActivity().getAssets())); venue.setTypeface(Utils.getHeroFace(getActivity().getAssets())); name.setTextColor(getResources().getColor(R.color.black)); venue.setTextColor(getResources().getColor(R.color.darkgrey)); time.setTextColor(getResources().getColor(R.color.black)); //ImageView favouriteicon=(ImageView)v.findViewById(R.id.fav_status_image); // ImageView remindericon=(ImageView)v.findViewById(R.id.reminder_status_image); name.setText(event.getName()); time.setText(Html.fromHtml("<b>"+event.getEvent_time()+"</b><br></br>"+event.getEvent_date())); venue.setText(event.getVenue()); } return v; } } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) { eventnotifierapp app=(eventnotifierapp)getActivity().getApplication(); app.crntEvent=(Event) events.get(pos); //startActivity(new Intent(this.getActivity(), EventDescription.class)); EventDescriptionFragment frag = EventDescriptionFragment.NewInstance(); ((MainActivity)getActivity()).OpenNextFragment(frag); } } 

ScheduleFragmentAdapter:

  public class ScheduleFragmentAdapter extends FragmentStatePagerAdapter{ String cat_name; protected static final String[] CONTENT = new String[] { "Thursday, Feb 20", "Friday, Feb 21", "Saturday, Feb 22", "Sunday, Feb 23", }; private int mCount = CONTENT.length; public ScheduleFragmentAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { if(position == 0) return ScheduleListSubFragment.newInstance(day1start, day1end); if(position == 1) return ScheduleListSubFragment.newInstance(day2start, day2end); if(position == 2) return ScheduleListSubFragment.newInstance(day3start, day3end); else return ScheduleListSubFragment.newInstance(day4start, day4end); } @Override public int getCount() { return mCount; } @Override public CharSequence getPageTitle(int position) { return CONTENT[position % CONTENT.length]; } } 

Investigación hice algunas excavaciones en stackOverFlow, y encontró algunas consultas relacionadas, que no eran exactamente los mismos, pero no podía llegar a una solución

Cualquier tipo de ayuda, es muy apreciada.

Hola acaba de obtener su código de ejecución, lo que me ayuda a resolver su problema es: 1. No use getChildFragmentManager() en la inicialización de su adaptador como:

fragadapter = new myfragmentAdapter(getChildFragmentManager());

Esto le dará tiempo de ejecución Error derecho ?? Que así porque en la aplicación de botón pulsado de nuevo no tienen su contexto de fragmento (según mi opinión) por lo que añadir su fragmento en la pila de atrás como:

 public void addpagerfragment(View v) { pagerFragment frag = pagerFragment.NewInstance(); crrntfrag = frag; FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.container, frag).addToBackStack(null); ft.commit(); } 
  • Cambio de la imagen de fondo del fragmento actual en viewpager
  • Cargar sólo un fragmento en ViewPager
  • Android setUserVisibleHint nunca se llama?
  • Quitar todos los fragmentos de ViewPager poblados por FragmentStatePagerAdapter
  • Android FragmentStatePagerAdapter devuelve pantalla en blanco al recargar fragmentos de medio
  • FragmentStatePageAdapter: Múltiples elementos visibles al mismo tiempo - ¿Cómo centrar una página específica?
  • FragmentStatePagerAdapter OutOfMemoryError
  • Salta dinámicamente páginas en ViewPager
  • ¿Cómo evitar recrear Fragment en ViewPager?
  • FragmentStatePagerAdapter fuga de memoria (fragmentos anidados con viewpager)
  • El fragmento ya no existe para la clave f0: index 1
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.