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);