title: FragmentPagerAdapter dynamic tabs and page count
body: <p>My application pulls data from a web service that generates different sections for each user. Then I am going to use these sections to create tabs using FragmentPagerAdapter. </p>
  
  <p>I have used an Async task to pull data from the web service. However the overridden methods such as getCount() and getPageTitle() in the  FragmentPagerAdapter executed prior to my asynctask and completes its job. How can I prevent this and generate dynamic number of tabs and their title name based on the data fetched from the web service? </p>
  
  <p>In other words how can I create dynamic number of tabs and titles based on the data fetch from the web service</p>
  
  <p>My Code for FragmentPagerAdapter as below. As you can see I have hard coded the amount of tabs as well as their title names.</p>
  
  <pre><code>public class SectionsPagerAdapter extends FragmentPagerAdapter{
  
      private boolean proceedStatus = false;
      private String requestURL = "xxxxxxxxxxxxxxxxxxxxxxxx";
  
      //list of fragments need to be added dynamically
      public final ArrayList&lt;Fragment&gt; screens = new ArrayList&lt;Fragment&gt;();
  
  
  
      public SectionsPagerAdapter(FragmentManager fm) {
          super(fm);
  
      }
  
      @Override
      public Fragment getItem(int position) {
          // getItem is called to instantiate the fragment for the given page.
          // Return a DummySectionFragment (defined as a static inner class
          // below) with the page number as its lone argument.
          Fragment fragment = new SectionFragment();
          Bundle args = new Bundle();
          args.putInt(SectionFragment.ARG_SECTION_NUMBER, position + 1);
          fragment.setArguments(args);
          return fragment;
      }
  
      @Override
      public int getCount() {
          return 2;
      }
  
      @Override
      public CharSequence getPageTitle(int position) {
          Locale l = Locale.getDefault();
          switch (position) {
          case 0:
              return "Camera".toUpperCase(l);
          case 1:
              return getString(R.string.title_section2).toUpperCase(l);
          case 2:
              return getString(R.string.title_section3).toUpperCase(l);
          case 3: 
              return "SECTION 4";
          }
          return null;
      }
  
      //setting the section title
      private void setSectionTitle(){
  
      }
  
      //count the number of sections
      private int countNumberofSections(){
          int numberOfSection = 0;
          return numberOfSection;
      }
  }
  </code></pre>
  
  <p>Then I have my Fragment code as below which has the the caller to the Async Task</p>
  
  <pre><code>public static class SectionFragment extends Fragment implements OnTaskCompleted {
      /**
       * The fragment argument representing the section number for this
       * fragment.
       */
      private Slider adapter;
      private ViewPager viewPager;
      public static final String ARG_SECTION_NUMBER = "section_number";
      Button thumbUpBut;
      Button thumbDownBut;
      Button captureButton;
      ImageView genImage;
      TextView genCaption;
      private Camera mCamera;
      private CameraPreview mPreview;
      private static File mediaFile;
      private ProgressDialog progress;
      private static String imageSaveLocation;
      private static String file_name_without_extension;
      private ImageView imageView;
      private Button uploadButton;
      private Button cancelButton;
      private Collection&lt;Place&gt; places = null;
      private Collection&lt;Happenings&gt; events = null;
      private Collection&lt;General&gt; general = null;
      private ArrayList&lt;String&gt; sections;
  
      public int getNumberOfPages(){
          return sections.size();
      }
  
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
          View rootView = inflater.inflate(R.layout.fragment_main_dummy,container, false);
          TextView dummyTextView = (TextView) rootView.findViewById(R.id.section_label);
          dummyTextView.setText(Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER)));
  
          FeedRequest task = new FeedRequest(this);
          task.execute("xxxxxxxxxxxxxxxxxxxxxxxxxxxxx");  
  
          captureButton = (Button) rootView.findViewById(R.id.button_capture);
          captureButton.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  takePhoto();
              }
          });
  
          thumbUpBut = (Button) rootView.findViewById(R.id.thumbUp);
          thumbUpBut.setOnClickListener(new OnClickListener() {
  
              public void onClick(View v) {
                  Log.v("thumbPress", "thumbPressUp");
                  thumb("up");
              }
          });
  
          thumbDownBut = (Button) rootView.findViewById(R.id.thumbDown);
          thumbDownBut.setOnClickListener(new OnClickListener() {
  
              public void onClick(View v) {
                  Log.v("thumbPress", "thumbPressDown");
                  thumb("down");
              }
          });
  
          //allocating the activity one to the camera
          if(getArguments().getInt(ARG_SECTION_NUMBER) == 1){
              mCamera = getCameraInstance();
              mPreview = new CameraPreview(this.getActivity(), mCamera);
              FrameLayout preview = (FrameLayout)rootView.findViewById(R.id.camera_preview);
              preview.addView(mPreview);
  
              //hide buttons
              thumbDownBut.setVisibility(rootView.INVISIBLE);
              thumbUpBut.setVisibility(rootView.INVISIBLE);
          }else{
              thumbDownBut.setVisibility(rootView.VISIBLE);
              thumbUpBut.setVisibility(rootView.VISIBLE);
              captureButton.setVisibility(rootView.INVISIBLE);
          }
  
          viewPager = (ViewPager) rootView.findViewById(R.id.pager);
          return rootView;
      }
  
      //take photo function
      private void takePhoto() {
  
          //get coordinates of the location
          UserLocation userLocation = new UserLocation();
          userLocation.getUserLocation(getActivity());
          coordinates[0] = userLocation.longitude;
          coordinates[1] = userLocation.latitude;
  
          PictureCallback pictureCB = new PictureCallback() {
              public void onPictureTaken(byte[] data, Camera cam) {
                  new SavePhotoAndMetadata().execute(data);
                  cam.startPreview();
              }
          };
          mCamera.takePicture(null, null, pictureCB);
      }
  
      //get camera instance
      private Camera getCameraInstance() {
          Camera camera = null;
          try {
              camera = Camera.open();
          } catch (Exception e) {
              // cannot get camera or does not exist
          }
          return camera;
      }
  
      //get the media out
      private static File getOutputMediaFile() {
          File mediaStorageDir = new File(Environment.getExternalStorageDirectory() + "/Android/data/asia.ceynet.realsnap/temp_img");
          if (!mediaStorageDir.exists()) {
              if (!mediaStorageDir.mkdirs()) {
                  Log.d("MyCameraApp", "failed to create directory");
                  return null;
              }
          }
          // Create a media file name
          String timeStamp = (DateFormat.format("dd-MM-yyyy hh:mm:ss", new java.util.Date()).toString());
          mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
          file_name_without_extension = "IMG_" + timeStamp;
          imageSaveLocation = mediaFile.toString();
          return mediaFile;
      }
  
      //saving the image and metadata together
      class SavePhotoAndMetadata extends AsyncTask&lt;byte[], String, String&gt; {
          @Override
          protected String doInBackground(byte[]... data) {
              File picFile = getOutputMediaFile();
              if (picFile == null) {
                  return null;
              }
  
              byte[] photoData = data[0];
              try {
                  //save the image
                  FileOutputStream fos = new FileOutputStream(picFile);
                  fos.write(photoData);
                  fos.close();
              } catch (FileNotFoundException e) {
                  e.getStackTrace();
              } catch (IOException e) {
                  e.getStackTrace();
              }
              return null;
          }
  
          @Override
          protected void onPreExecute() {
              super.onPreExecute();
              progress = new ProgressDialog(getActivity());
              progress.setMessage("Saving Picture..Please wait...");
              progress.show();
          }
  
          @Override
          protected void onPostExecute(String s) {
              progress.dismiss();
              imagePreviewDialog();
          }
      }
  
      //save image metadata in async task 
      class SaveMetadataTask extends AsyncTask&lt;Void, String, Void&gt; {
  
          @Override
          protected Void doInBackground(Void... params) {
              serializeDeserialize.serializeData("This is for testing", file_name_without_extension, Double.toString(coordinates[0]), Double.toString(coordinates[1]), deviceId, deviceEmail);
              return null;
          }
  
          @Override
          protected void onPreExecute() {
              super.onPreExecute();
          }
  
          @Override
          protected void onPostExecute(Void v) {
  
          }
      }
  
      //image preview dialog and its functionality
      private void imagePreviewDialog(){
          //setting the bitmap
          Bitmap bmp = BitmapFactory.decodeFile(mediaFile.toString());
  
          AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
          builder.setTitle("Image Preview");
          builder.setCancelable(false);
          LayoutInflater inflater = getActivity().getLayoutInflater();
          ViewGroup vg = (ViewGroup)inflater.inflate(R.layout.sanp_preview_layout, null);
          ImageView image = (ImageView) vg.findViewById(R.id.imageView);
          image.setImageBitmap(rotateBitmap(bmp));
          builder.setView(vg);
  
           //buttons
           builder.setPositiveButton("Upload",new DialogInterface.OnClickListener() {
                  public void onClick(DialogInterface dialog, int whichButton) {
  
                      if(checkInternetConnection.haveNetworkConnection(sContext)){
                          //upload the image
                          uploadImage();
  
                          //save image metadata
                          new SaveMetadataTask().execute();
                      }else{
                          Toast.makeText(sContext, "Error! No internet connection detected. Image will be uploaded on an active internet connection", Toast.LENGTH_LONG).show();
                          new SaveMetadataTask().execute();
                      }
                  }
           });
  
           builder.setNegativeButton("Discard",new DialogInterface.OnClickListener() {
                  public void onClick(DialogInterface dialog, int whichButton) {
                      discardImage(mediaFile.toString());
                      dialog.dismiss();
                  }
           });
          builder.show();
      }
  
      private Bitmap rotateBitmap(Bitmap image){
          int width=image.getHeight();
          int height=image.getWidth();
  
          Bitmap srcBitmap=Bitmap.createBitmap(width, height, image.getConfig());
  
          for (int y=width-1;y&gt;=0;y--)
              for(int x=0;x&lt;height;x++)
                  srcBitmap.setPixel(width-y-1, x,image.getPixel(x, y));
          return srcBitmap;
  
      }
  
      //device email
      private String getDeviceEmail(){
          AccountManager accountManager = AccountManager.get(sContext);
          Account[] account = accountManager.getAccountsByType("com.google");
  
          //device email
          for(Account accLoop : account){
              deviceEmail = accLoop.name;
          }
          return deviceEmail;
      }
  
      //upload image to the server
      private void uploadImage(){
  
          //save metadata
  
          //call upload service
          Intent intent = new Intent(sContext, HttpUploader.class);
          Bundle loc = new Bundle();
          loc.putDoubleArray("ss", coordinates);
          intent.putExtra("url", PHOTO_UPLOAD);
          intent.putExtra("paths", mediaFile.toString());
          intent.putExtra("deviceid", deviceId);
          intent.putExtra("deviceemail", getDeviceEmail());
          intent.putExtra("posttext", "This is for testing");
          intent.putExtra("filename", file_name_without_extension);
          intent.putExtra("geo", loc);
          sContext.startService(intent);
  
          Toast.makeText(getActivity(), "Your image is being uploaded", Toast.LENGTH_LONG).show();
      }
  
      //discard image when the discard button is pressed
      private void discardImage(String imagePath){
          File file = new File(imagePath);
          try{
              file.delete();
          }catch(Exception e){
              Log.e("IMAGE_DELETION_ERROR", e.toString());
          }
      }
  
      @Override
      public void onTaskCompleted(boolean status, String message) {
          // TODO Auto-generated method stub
  
          Log.e("onTaskCompleted", "success" + status);
  
          if (message == "tumb UP success") {
              thumbUpBut.setSelected(true);
              thumbDownBut.setSelected(false);
              Log.e("tumb", "tumb");
  
          } else if (message == "tumb DOWN success") {
              thumbDownBut.setSelected(true);
              thumbUpBut.setSelected(false);
              Log.e("tumb", "tumb");
          }
      }
  
      //listener for fetching main objects
      @Override
      public void onFeedCompleted(ArrayList&lt;Posts&gt; postArray, Multimap&lt;String, Object&gt; multiMap) {
          // TODO Auto-generated method stub
          numberOfPages = postArray.size();
          adapter = new Slider(getActivity(), postArray, getContext());
          viewPager.setAdapter(adapter);
          // displaying selected image first
          viewPager.setCurrentItem(postArray.size());
  
          //saving the keyset
          Set&lt;String&gt; keys = multiMap.keySet();
          sections =  new ArrayList&lt;String&gt;();
  
          //sorting the categories and creating the category list
          for(String key:keys){
  
              //getting category list
              if(!sections.contains(keys)){
                  sections.add(key);
              }
  
              //sorting categories
              if(key.equals("Place")){
                  places.add((Place) multiMap.get(key));
              }else if(key.equals("Events")){
                  events.add((Happenings) multiMap.get(key));
              }else if(key.equals("General")){
                  general.add((General) multiMap.get(key));
              }
          }
      }
  
      //adding the pages to the adaptor dynamically
      public void addPagesDynamically(){
  
      }
  }
  
  //create the parent directory
  private void createParentDiectory(){
      File dir = new File(Environment.getExternalStorageDirectory() + "/Android/data/asia.ceynet.realsnap");
      if(!(dir.exists() &amp;&amp; dir.isDirectory())) {
          dir.mkdirs();
      }
  }
  
  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
      // Handle presses on the action bar items
      switch (item.getItemId()) {
      case R.id.action_post:
          openPost();
          return true;
      case R.id.action_settings:
          // openSettings();
          return true;
      default:
          return super.onOptionsItemSelected(item);
      }
  }
  
  public void openPost() {
      /*
      Intent i = new Intent(getApplicationContext(), PhotoActivity.class);
      startActivity(i);
      */
  }
  
  public static void thumb(String type) {
      SectionFragment d = new SectionFragment();
      PostThumb task = new PostThumb(type, d);
      task.execute("xxxxxxxxxxxxxxxxxxxxxxxxxxxx");
  }
  
  //broadcast receiver for picture upload
  public class MyWebRequestReceiver extends BroadcastReceiver {
  
      public static final String PROCESS_RESPONSE = "asia.ceynet.intent.action.PROCESS_RESPONSE";
      @Override
      public void onReceive(Context context, Intent intent) {
          //String responseString = intent.getStringExtra(HttpUploader.RESPONSE_STRING);
          String reponseMessage = intent.getStringExtra(HttpUploader.RESPONSE_MESSAGE);
          String responseStatus = intent.getStringExtra(HttpUploader.RESPONSE_STATUS);
          String file_to_be_deleted = intent.getStringExtra(HttpUploader.FILE_NAME_WITHOUT_EXTENSION);
          Toast.makeText(getApplicationContext(), reponseMessage + " - " + file_to_be_deleted + ".jpg", Toast.LENGTH_LONG).show();
  
          //if uploaded successfully delete or image and metadata
          if(responseStatus.equals("true")){
              File temp_image_dir = new File(Environment.getExternalStorageDirectory() + "/Android/data/asia.ceynet.realsnap/temp_img/" + file_to_be_deleted + ".jpg");
              File metadata_file = new File(Environment.getExternalStorageDirectory() + "/Android/data/asia.ceynet.realsnap/temp_img/" + file_to_be_deleted + ".ser");
              try{
                  temp_image_dir.delete();
                  metadata_file.delete();
              }catch(Exception e){
                  Log.e("IMAGE_DELETION_ERROR", e.toString());
              }
          }
      }
  }
  </code></pre>