mn6vdv23g
mn6vdv23g

Reputation: 734

ListView empties after switching a fragment in fragmentHolder

I have a listview in one of my fragments and it empties when I leave that fragment.

Why is it happening?

That fragment:

public class ListActivity extends ListFragment {

    public void ToastLoadShout(String msg) {
        Toast.makeText(getActivity(), msg.toString(), Toast.LENGTH_LONG).show();
    }
    private static View View;

    HttpClient client;
    HttpPost httppost;
    HttpGet httpget;
    JSONObject json;
    List<List<String>> items;
    List<item> markers = new ArrayList<item>();

    MobileArrayAdapter adapter;

    ListView list;
    ProgressBar listload;
    Button relist;

    Preferences pref;

    String datadata = "";

    String savedlat="0.0";
    String savedlon="0.0";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.activity_list, container, false);
    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true); 


    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setRetainInstance(true); 

        try {
            pref = new Preferences(getActivity());
            list = (ListView) getView().findViewById(android.R.id.list);
            listload = (ProgressBar) getView().findViewById(R.id.listload);
            HashMap<String, String> loc = pref.getData();
            ToastLoadShout(loc.get(Preferences.LAT) + ","
                    + loc.get(Preferences.LON));
            if (loc.get(Preferences.LAT) != "0.0" && loc.get(Preferences.LAT) != null)
            {
                //adapter.deleteList();
                //list.destroyDrawingCache();
                if (loc.get(Preferences.LAT) != savedlat && loc.get(Preferences.LON)!=savedlon){
                new Load().execute();
                savedlat=loc.get(Preferences.LAT);
                savedlon=loc.get(Preferences.LON);
                }
            }
            else
                ToastLoadShout("Get Location First.");

            relist = (Button) getView().findViewById(R.id.relist);
            relist.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    listload.setVisibility(View.INVISIBLE);
                    HashMap<String, String> loc = pref.getData();
                    ToastLoadShout(loc.get(Preferences.LAT) + ","
                            + loc.get(Preferences.LON));
                    if (loc.get(Preferences.LAT) != "0.0" && loc.get(Preferences.LAT) != null){
                        adapter.deleteList();
                        list.destroyDrawingCache();
                        new Load().execute();}
                    else
                        ToastLoadShout("Get Location First.");
                }});

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {

        // get selected items
        //String selectedValue = (String) getListAdapter().getItem(position);
        String selectedValue = markers.get(position).getTitle();
        Toast.makeText(getActivity(), selectedValue, Toast.LENGTH_SHORT).show();

    }

}

And the MainActivity which holds the fragments:

public class Fragments extends FragmentActivity {

    Fragment newFragment;
    Button Add;
    public void ToastLoadShout(String msg) {

        Toast.makeText(this, msg.toString(), Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragments);

        //Set Custom actionBar<
        getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        getActionBar().setCustomView(R.layout.titlebar);
        getActionBar().setHomeButtonEnabled(true);
        getActionBar().setDisplayHomeAsUpEnabled(true);
        //Set Custom actionBar>

        ListActivity fragment = new ListActivity();
        FragmentTransaction transaction = getSupportFragmentManager()
                .beginTransaction();
        transaction.add(R.id.fragment_place, fragment,"Nearby");
        transaction.commit();

        turnGPSOn();

         Add = (Button)findViewById(R.id.add);
         Add.setOnClickListener(new OnClickListener() {
         public void onClick(View v) {
         Intent Intent = new Intent(Fragments.this,Add.class);
         Bundle bndlanimation =
         ActivityOptions.makeCustomAnimation(getApplicationContext(),
         R.anim.animation,R.anim.animation2).toBundle();
         startActivity(Intent, bndlanimation);
         }
         });

         /* For putting commas in attractin's checkIns
         String number = "1345";
         int amount = Integer.parseInt(number);
         DecimalFormat formatter = new DecimalFormat("#,###");
         ToastLoadShout(formatter.format(amount));*/
    }

    public void onSelectFragment(View view) {

        String fragTag="";
        boolean needNew=false;

         if (view == findViewById(R.id.map)) 
            {
            Fragment f = getSupportFragmentManager().findFragmentByTag("Map");
            if (f==null){
                newFragment = new MainActivity();
                needNew=true;
                fragTag="Map";
            }

            else{
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.fragment_place, f, "Map"); //or whatever other string you want to use
            transaction.addToBackStack(null);
            transaction.commit();
            }
        }

         else if (view == findViewById(R.id.nearby)) 
            {
            Fragment f = getSupportFragmentManager().findFragmentByTag("Nearby");
            if (f==null){
                newFragment = new ListActivity();
                needNew=true;
                fragTag="Nearby";
            }

            else{
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.fragment_place, f, "Nearby"); //or whatever other string you want to use
            transaction.addToBackStack(null);
            transaction.commit();
            }
        }


        if (needNew) {
            FragmentTransaction transaction = getSupportFragmentManager()
                    .beginTransaction();
            transaction.replace(R.id.fragment_place, newFragment, fragTag);
            transaction.addToBackStack(null);
            transaction.commit();
        }
    }

}

Already tried loading the list on OnCreate. Doesn't work at all.

Thanks for your assistance.

EDIT:

Load.Class:

class Load extends AsyncTask<String, Integer, Boolean> {
        @Override
        protected void onPreExecute() {
            listload.setVisibility(View.VISIBLE);
        }

        @Override
        protected Boolean doInBackground(String... params) {

            try {
                items = DownloadList();
                if (items != null)
                    return true;

            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
            return false;
        }

        @Override
        protected void onPostExecute(Boolean res) {
            // TODO Auto-generated method stub
            if (res) {
                ArrangePutMarkers();
                adapter=new MobileArrayAdapter(getActivity(), markers);
                list.setAdapter(adapter);
            } else {
                ToastLoadShout("Error");
                ToastLoadShout(datadata);
            }
            listload.setVisibility(View.INVISIBLE);
        }
    }

Upvotes: 1

Views: 325

Answers (2)

Dmide
Dmide

Reputation: 6462

Keep your adapter in activity as a field. Destroying everything in your fragment when you leave it is a normal thing. setRetainInstance() works only on configuration changes, such as screen rotating. Recreate your list every time you came back in your fragment (in onActivityCreated(), for example, like you do know) and supply it with your stored adapter with saved data in it. You can gain access to your activity inside a fragment, for example, by casting (MainActivity)getActivity(), as an Activity which is passed to this fragment in this case is actually your activity.

Upvotes: 1

MineConsulting SRL
MineConsulting SRL

Reputation: 2340

As i can see you recreate the loc object every time the fragment is displayed. It obviously makes you fragment to reload the data.

Upvotes: 1

Related Questions