Replacing Fragment in ViewPager shows blank screen?

android, android-fragmentactivity, android-fragments, android-viewpager

Solution

Try to extend FragmentStatePagerAdapter instead of FragmentPagerAdapter.

Here's my code for fragments and it works fine for me:

//Adapter
public class AllPagesAdapter extends FragmentStatePagerAdapter {



            public AllPagesAdapter(FragmentManager fm) {

                super(fm);

            }

            @Override
            public Fragment getItem(int index) {

        switch (index) {
            case 0:

                return new Android();

            case 1:

                return new CoreJava();
            case 2:

                return new J2EE();

            case 3:

                return new Database();

            case 4:

                return new WebServices();


        }
        return null;


    }

    @Override
    public int getCount() {
        return 5;
    }

}

//For example, this is one fragment:

public class Database extends Fragment {

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

        View databaseview = inflater.inflate(R.layout.database, container, false);

        return databaseview;

    }


}

//My MainActivity

public class AllActivities extends FragmentActivity implements ActionBar.TabListener {

    public ViewPager viewPager;
    private AllPagesAdapter mAdapter;
    private ActionBar actionBar;
    private String [] tabs = {"Android","CoreJava","J2EE","Database","Web Services"};

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

        //Initializing all stuff
        viewPager = (ViewPager)findViewById(R.id.pager);

        actionBar = getActionBar();
        mAdapter = new AllPagesAdapter(getSupportFragmentManager());
        viewPager.setAdapter(mAdapter);
        actionBar.setHomeButtonEnabled(true);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);



        //Add the tabs here
        for(String tab_name:tabs){
            actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
        }

        viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){

            @Override
        public void onPageSelected(int position){

                //on Page change, that particular page should be selected
                actionBar.setSelectedNavigationItem(position);
            }

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

            }
            @Override
        public void onPageScrollStateChanged(int position){

            }

        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction fragmentTransaction) {

        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction fragmentTransaction) {



    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction fragmentTransaction) {

        viewPager.setCurrentItem(tab.getPosition());

    }
}

Let me know if you also want the implementation of the listview in any one fragment.

Hope this helps..:)

Problem

I'm having a lot of trouble getting Fragments to work with Tabs/Swiping. I have one activity and two Fragments, one which has a ListView. What I want is when I swipe from fragment 1 to the fragment with the ListView, to refresh the ListView or if possible recreate the second fragment.... What I am trying right now is to use FragmentTransaction.replace() like this: ``` public void onTabSelected(Tab arg0, android.app.FragmentTransaction arg1) { // TODO Auto-generated method stub Fragment frag = new FragmentTwo(); FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); if (arg0.getPosition() == 1) { trans.replace(R.id.pager, frag); trans.addToBackStack(null); trans.commit(); } } ``` So I thought that when I swipe to tab 2, which is the one with the ListView, it would replace it with a new one, which it creates. What is actually happening is that when I swipe to tab 2, it recreates the fragment with the ListView (I know because I have a dialog in the onCreateView which shows to the screen) but then the fragment/tab is blank/black. What am I doing wrong? Where does this fragment which is created go? I don't know if the code of the fragments is relevant but please let me know if I should post it and I can do that. This is my PagerAdapter class. ``` public class TabsPagerAdapter extends FragmentPagerAdapter { public TabsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int index) { switch (index) { case 0: return new FragmentOne(); case 1: return new FragmentTwo(); case 2: return new FragmentThree(); } return null; } @Override public int getCount() { // get item count - equal to number of tabs return 3; } } ``` Thanks for any help! I'm really pulling my hair out over this one :( Edit: When you swipe from tab 1 to tab 2, tab 2 shows my dialog and then loads the tab, but if I go back to tab 1 its all black...and if I then go to tab 2 again, it creates again and shows my dialog and then goes black as well... Edit: (adding listview fragment code) public class FragmentTwo extends Fragment { ``` // Progress Dialog private ProgressDialog pDialog; // Creating JSON Parser object JSONParser_Helpers2 jParser = new JSONParser_Helpers2(); ArrayList<HashMap<String, String>> tripList; // url to get all products list private static String url_all_trips = "http://10.0.2.2/android_connect/get_all_trips.php"; // JSON Node names private static final String TAG_SUCCESS = "success"; private static final String TAG_TRIPS = "trips"; private static final String TAG_TRIPID = "tripid"; private static final String TAG_TRIPNAME = "tripName"; private static final String TAG_UID = "uid32"; // products JSONArray JSONArray trips = null; View rootView; Button btnRefresh; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //View rootView = inflater.inflate(R.layout.fragment_one, container, false); rootView = inflater.inflate(R.layout.fragment_two, container, false); btnRefresh = (Button) rootView.findViewById(R.id.refresh); // Hashmap for ListView tripList = new ArrayList<HashMap<String, String>>(); // Loading products in Background Thread new LoadAllProducts().execute(); // Get listview ListView lv = (ListView) rootView.findViewById(R.id.list); // on seleting single product // launching Edit Product Screen lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //getting values from selected ListItem String tripid = ((TextView) view.findViewById(R.id.pid)).getText().toString(); //starting new intent Intent in = new Intent(getActivity(), EditTrip_Activity.class); //sending pid to next activity in.putExtra(TAG_TRIPID, tripid); //starting new activity and expecting some response back startActivityForResult(in, 100); } }); return rootView; } /** * Background Async Task to Load all product by making HTTP Request * */ class LoadAllProducts extends AsyncTask<String, String, String> { ListView lv = (ListView) rootView.findViewById(R.id.list); /** * Before starting background thread Show Progress Dialog * */ @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(getActivity()); pDialog.setMessage("Loading your trips. Please wait..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); pDialog.show(); } /** * getting All products from url * */ protected String doInBackground(String... args) { // Building Parameters List<NameValuePair> params = new ArrayList<NameValuePair>(); // getting JSON string from URL JSONObject json = jParser.makeHttpRequest(url_all_trips, "GET", params); // Check your log cat for JSON response Log.d("All Trips: ", json.toString()); try { // Checking for SUCCESS TAG int success = json.getInt(TAG_SUCCESS); if (success == 1) { // products found // Getting Array of Products trips = json.getJSONArray(TAG_TRIPS); // looping through All Products for (int i = 0; i < trips.length(); i++) { JSONObject c = trips.getJSONObject(i); // Storing each json item in variable String tripid = c.getString(TAG_TRIPID); String tripname = c.getString(TAG_TRIPNAME); String userId = c.getString("uid"); // creating new HashMap DatabaseHandler_Helpers db = new DatabaseHandler_Helpers(getActivity()); HashMap<String, String> map = new HashMap<String, String>(); if (userId.equals(db.getUserDetails().get("uid"))) { // adding each child node to HashMap key => value map.put(TAG_TRIPID, tripid); map.put(TAG_TRIPNAME, tripname); // adding HashList to ArrayList tripList.add(map); } //else { //map.put(TAG_TRIPID, ""); //map.put(TAG_TRIPNAME, "You have no tracked trips."); //tripList.add(map); //} } } else { // no products found // Launch Add New product Activity Intent i = new Intent(getActivity(), NewTrip_Activity.class); // Closing all previous activities i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); } } catch (JSONException e) { e.printStackTrace(); } return null; } /** * After completing background task Dismiss the progress dialog * **/ protected void onPostExecute(String file_url) { // dismiss the dialog after getting all products pDialog.dismiss(); // updating UI from Background Thread ((Activity) getActivity()).runOnUiThread(new Runnable() { public void run() { /** * Updating parsed JSON data into ListView * */ ListAdapter adapter = new SimpleAdapter( getActivity(), tripList, R.layout.list_item, new String[] { TAG_TRIPID, TAG_TRIPNAME}, new int[] { R.id.pid, R.id.name }); // updating listview ((ListView) lv.findViewById(R.id.list)).setAdapter(adapter); } }); } } ``` }

Original source