0

When I add the viewpager fragment everything goes nice, but when I move to another apps and returns to my app, I have a weird problem that getView or inflated is null. It is showing the view, but I can't have access to it.

Here comes the Fragment that will be used in the ViewPager:

public class FragmentRestauranteBandejao extends Fragment {

JSONObject dados;
View inflated;
ExpandableListView cardapio;
List<String> refeicoes;
List<String> pratos_almoco;
List<String> pratos_janta;
Map<String, List<String>> bandejao = null;
ExpandableListAdapter adapter;

public static FragmentRestauranteBandejao newInstance(String restaurante){
    FragmentRestauranteBandejao frag = new FragmentRestauranteBandejao();

    Bundle args = new Bundle();
    args.putString("restaurante", restaurante);
    frag.setArguments(args);
    return frag; 
}

public void getDados(){
    if(dados == null){
        if(USPRestaurantes.getDados()){
            dados = USPRestaurantes.getCardapioByRestaurante(getArguments().getString("restaurante"));
        }else{
            Log.d("debug", "Dados ainda não estão prontos");
            return;
        }   
    }

    if(inflated == null){
        Log.d("debug", "inflated eh null");
        if(inflated == null){
            return;
        }
    }
    //... some code here that deals with the data that comes from a request made at USPRestaurantes.
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    inflated = inflater.inflate(R.layout.fragment_cardapio, container, false);

    return inflated;
}


@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    inflated = view;
    prepararCardapio();
    getDados();
}

public void prepararCardapio(){

    cardapio = (ExpandableListView) getView().findViewById(R.id.cardapio);
    cardapio.setClickable(true);

    refeicoes = new ArrayList<String>(Arrays.asList("Almoço","Jantar"));
    pratos_almoco = new ArrayList<String>();
    pratos_janta = new ArrayList<String>();
    pratos_almoco.add("");
    pratos_janta.add("");

    bandejao = new LinkedHashMap<String, List<String>>();

    bandejao.put(refeicoes.get(0), pratos_almoco);
    bandejao.put(refeicoes.get(1), pratos_janta);

    adapter = new ExpandableListViewAdapter(getActivity(), refeicoes, bandejao);
    cardapio.setAdapter(adapter);
}

ViewPager Fragment:

public class FragmentBandejoes extends Fragment{

private String[] tabs = {"Central", "Química", "Física"};

private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ArrayList<Fragment> paginasBandeco;
public int dia_semana = 0;
ProgressDialog dialog;

private TabPageIndicator mIndicator;
int number = 0;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    paginasBandeco = new ArrayList<Fragment>();
    paginasBandeco.add(FragmentRestauranteBandejao.newInstance("central"));
    paginasBandeco.add(FragmentRestauranteBandejao.newInstance("quimica"));
    paginasBandeco.add(FragmentRestauranteBandejao.newInstance("fisica"));

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View inflated = inflater.inflate(R.layout.fragment_bandejoes, container, false);
    return inflated;    
}

public void notifyFragments(){

    for(int i=0; i<3; i++){     
        ((FragmentRestauranteBandejao) mAdapter.getItem(i)).getDados();
    }

    if(dialog != null){
        dialog.dismiss();
    }

}

public void getCardapios(boolean update){
    if(!USPRestaurantes.getDados() || update){

        boolean request_made = USPRestaurantes.getCardapio(getActivity());
    }
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {

    getCardapios(false);

    viewPager = (ViewPager) getView().findViewById(R.id.pager_bandejoes);

    mAdapter = new TabsPagerAdapter(((MainActivity) getActivity()).fragmentManager, paginasBandeco, tabs);

    viewPager.setAdapter(mAdapter);
    mIndicator = (TabPageIndicator) getActivity().findViewById(R.id.indicator);
    mIndicator.setViewPager(viewPager);

    mIndicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            mIndicator.setCurrentItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {                
        }
    });     
}

And Finally the FragmentStatePagerAdapter:

public class FragmentBandejoes extends Fragment{

private String[] tabs = {"Central", "Química", "Física"};

private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ArrayList<Fragment> paginasBandeco;
public int dia_semana = 0;
ProgressDialog dialog;

private TabPageIndicator mIndicator;
int number = 0;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    paginasBandeco = new ArrayList<Fragment>();
    paginasBandeco.add(FragmentRestauranteBandejao.newInstance("central"));
    paginasBandeco.add(FragmentRestauranteBandejao.newInstance("quimica"));
    paginasBandeco.add(FragmentRestauranteBandejao.newInstance("fisica"));

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View inflated = inflater.inflate(R.layout.fragment_bandejoes, container, false);
    return inflated;    
}

public void notifyFragments(){

    for(int i=0; i<3; i++){     
        ((FragmentRestauranteBandejao) mAdapter.getItem(i)).getDados();
    }

    if(dialog != null){
        dialog.dismiss();
    }

}

public void getCardapios(boolean update){
    if(!USPRestaurantes.getDados() || update){

        boolean request_made = USPRestaurantes.getCardapio(getActivity());
    }
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {

    getCardapios(false);

    viewPager = (ViewPager) getView().findViewById(R.id.pager_bandejoes);

    mAdapter = new TabsPagerAdapter(((MainActivity) getActivity()).fragmentManager, paginasBandeco, tabs);

    viewPager.setAdapter(mAdapter);
    mIndicator = (TabPageIndicator) getActivity().findViewById(R.id.indicator);
    mIndicator.setViewPager(viewPager);

    mIndicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            mIndicator.setCurrentItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {                
        }
    });     
}

Additional Info: When I swipe to the other tabs, the view gets recreated and then it shows the data. Thanks in advance

douglas.iacovelli
  • 1,346
  • 2
  • 14
  • 12

1 Answers1

0

From what I can tell reading you code is that you are not taking into consideration the fragment's lifecycle.

Fragments, as Activities, have Lifecycle methods that you should use in order for them to render correctly. I suggest using the onResume callback and with it check if you have any data to display. If you do display them in your fragment. If you don't do what you do when you create the fragmet

gkaimakas
  • 574
  • 3
  • 17