with viewpager tablayout tab studio showing not example attach and android android-fragments android-listview android-viewpager fragmentstatepageradapter

android - tablayout - viewpager not showing fragment



¿Cómo evitar recrear Fragment en ViewPager? (2)

Lo he arreglado de la siguiente manera:

En el método onViewCreated () de mi Fragmento, evito volver a crear el Adaptador, comprobando si es nulo.

@Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // setup adapter if(mAdapter == null) { mAdapter = new AdapterProductList((FragmentActivity) getActivity(), new ArrayList()); mAdapter.setOnLastItemListener(this); } ... ... }

Estoy usando un ViewPager con un FragmentStatePagerAdapter que contiene 5 páginas.

En la primera página tengo un ListView con elementos. Cuando cambio en la última página de ViewPager y vuelvo a la primera página, mi ListView está vacío porque se ha vuelto a crear el Adaptador.

Android siempre llama a los siguientes métodos: onAttach (), onCreate (), onCreateView (), onViewCreated (), onActivityCreated (), onStart () y onResume ().

Me gustaría no utilizar los métodos ViewPager.setOffscreenPageLimit () para evitar que se destruyan mis páginas. Hay alguna solución alternativa?

El comportamiento que quiero es el mismo que hace Facebook.

¿Qué estoy haciendo mal? ¿Cómo puedo mantener los datos en mi ListView?

Código de mi FragmentStatePageAdapter:

public class AdapterMain extends FragmentStatePagerAdapter { List<ChicfyFragment> fragments = new ArrayList<ChicfyFragment>(); public AdapterMain(FragmentManager fm) { super(fm); fragments.add(new FragmentShop()); fragments.add(new FragmentSearch()); fragments.add(new FragmentSell()); fragments.add(new FragmentNotification()); fragments.add(new FragmentProfile()); } @Override public Fragment getItem(int position) { return fragments.get(position); } @Override public int getCount() { return fragments.size(); } }

Código de la primera página de mi ViewPager:

public class FragmentShop extends ChicfyFragment implements SwipeRefreshLayout.OnRefreshListener { ListView mListView; AdapterProductList mAdapter; SwipeRefreshLayout mSwipeRefreshLayout; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_main_shop, container, false); mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_refresh); mListView = (ListView) view.findViewById(R.id.fragment_main_shop_listview); return view; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // setup adapter mAdapter = new AdapterProductList((FragmentActivity) getActivity(), new ArrayList()); // setup listview mListView.setAdapter(mAdapter); mListView.setDivider(null); // setup swipe mSwipeRefreshLayout.setColorScheme(R.color.red, R.color.white, R.color.blue, R.color.white); mSwipeRefreshLayout.setOnRefreshListener(this); } @Override public void onRefresh() { new AsyncTask<Void, Void, Void>() { List<String> list = new ArrayList<String>(); @Override protected Void doInBackground(Void... voids) { try { Thread.sleep(1000); for(int i=0; i<10; i++) list.add("" + i); } catch (Exception e) {} return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); mAdapter.clear(); mAdapter.addAll(list); mAdapter.notifyDataSetChanged(); mSwipeRefreshLayout.setRefreshing(false); } }.execute(); } }


Puedes usar esta línea para X count of fragments

mViewPager.setOffscreenPageLimit(X);