package org.osmdroid.samplefragments; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.FragmentManager; import android.support.v4.app.ListFragment; import android.util.Log; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; import org.osmdroid.ExtraSamplesActivity; import org.osmdroid.ISampleFactory; import org.osmdroid.model.BaseActivity; import java.util.ArrayList; import java.util.List; /** * Created by KjellbergZ on 16.12.2015. */ public class FragmentSamples extends ListFragment { public final static String TAG="osmfragsample"; private ISampleFactory sampleFactory=null; private List<BaseActivity> additionActivitybasedSamples; public static FragmentSamples newInstance(ISampleFactory fac, List<BaseActivity> additionActivitybasedSamples) { FragmentSamples x= new FragmentSamples(); x.sampleFactory=fac; x.additionActivitybasedSamples=additionActivitybasedSamples; return x; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //the following block of code took me an entire weekend to track down the root cause. //if the code block is in onCreate, it will leak. onActivityCreated = no leak. //makes no sense, but that's Android for you. // Generate a ListView with Sample Maps final ArrayList<String> list = new ArrayList<>(); // Put samples next for (int a = 0; a < sampleFactory.count(); a++) { final BaseSampleFragment f = sampleFactory.getSample(a); list.add(f.getSampleTitle()); } for (int a=0; a<additionActivitybasedSamples.size(); a++){ list.add(additionActivitybasedSamples.get(a).getActivityTitle()); } //changed from getActivity to Application context per http://www.slideshare.net/AliMuzaffar2/android-preventing-common-memory-leaks //prior to that, we had a memory leak that would only show on long running tests. the issue is that the array adapter //wasn't being gc'd. ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity().getApplicationContext(), android.R.layout.simple_list_item_1, list); setListAdapter(adapter); } @Override public void onListItemClick(ListView l, View v, int position, long id) { if (position < sampleFactory.count()) { // Replace Fragment with selected sample BaseSampleFragment frag = sampleFactory.getSample(position); Log.i(TAG, "loading fragment " + frag.getSampleTitle() + ", " + frag.getClass().getCanonicalName()); FragmentManager fm = getFragmentManager(); fm.beginTransaction().replace(org.osmdroid.R.id.samples_container, frag, ExtraSamplesActivity.SAMPLES_FRAGMENT_TAG) .addToBackStack(null).commit(); } else { Activity activity = additionActivitybasedSamples.get(position-sampleFactory.count()); Intent i = new Intent(getContext(), activity.getClass()); getActivity().startActivity(i); } } @Override public void onResume(){ super.onResume(); FragmentManager fm = getFragmentManager(); fm.popBackStack(); System.gc(); } @Override public void onDestroyView(){ super.onDestroyView(); } }