FragmentPagerAdapter动态选项卡和页面计数

时间:2014-07-22 12:12:26

标签: java android fragmentpageradapter

我的应用程序从Web服务中提取数据,该服务为每个用户生成不同的部分。然后我将使用这些部分使用FragmentPagerAdapter创建选项卡。

我使用Async任务从Web服务中提取数据。但是,在我的asynctask之前执行了重写的方法,例如FragmentPagerAdapter中的getCount()和getPageTitle(),并完成了它的工作。如何根据从Web服务获取的数据来阻止此操作并生成动态数量的选项卡及其标题名称?

换句话说,如何根据从Web服务获取的数据创建动态数量的选项卡和标题

我的FragmentPagerAdapter代码如下。正如您所看到的,我已经对选项卡的数量以及标题名称进行了硬编码。

public class SectionsPagerAdapter extends FragmentPagerAdapter{

    private boolean proceedStatus = false;
    private String requestURL = "xxxxxxxxxxxxxxxxxxxxxxxx";

    //list of fragments need to be added dynamically
    public final ArrayList<Fragment> screens = new ArrayList<Fragment>();



    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;
    }
}

然后我的片段代码如下所示,它具有异步任务的调用者

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<Place> places = null;
    private Collection<Happenings> events = null;
    private Collection<General> general = null;
    private ArrayList<String> 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<byte[], String, String> {
        @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<Void, String, Void> {

        @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>=0;y--)
            for(int x=0;x<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<Posts> postArray, Multimap<String, Object> 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<String> keys = multiMap.keySet();
        sections =  new ArrayList<String>();

        //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() && 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());
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

当您提取异步数据时,请为适配器提供新数据并在该适配器实例上调用.notifyDataSetChanged(),框架将自动更新页面并进行计数。

如果您希望在FragmentPagerAdapter实现后发布更详细的解释。

答案 1 :(得分:1)

首先,如果我不能说清楚,请告诉我,因为这是我第一次参加此活动之一。但我会一直在这里回答与这个答案有关的疑问,并清除我的陈述引起的任何混淆。

因为你正在使用片段,所以我假设你必须将你的片段包含在一个活动中(比如MainActivity.java)。
你需要什么,可以在包含片段的活动中完成。 以下是onCreate

MainActivity方法的示例代码
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentManager fragmentManager = getSupportFragmentManager();

    //Instance of viewpager included inside activity_main.xml
    viewPager = (ViewPager) findViewById(R.id.vpMain);


    SectionsPagerAdapter adapter = new SectionsPagerAdapter (fragmentManager);

    //Adding some fragments right from the beginning, you could ignore it if not needed.
    addFragments();

    //This `OnPageChangeListener` will do the trick for you.
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            //Show the title of fragment
            Toast.makeText(MainActivity.this, adapter.screens.get(position), Toast.LENGTH_SHORT).show();

            //If fragment being loaded is later than the first one,
            // then add one more fragment after the last fragment to the adapter.
            // integer currentPosition is declared as a field, outside onCreate method and initially set to 0.
            if(position>currentPosition){
                currentPosition+=1;
                adapter.addFragment(new SectionFragment(), "Fragment"+String.valueOf(position+3));
                adapter.notifyDataSetChanged();
            }else{
                currentPosition--;
            }
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });


} // onCreate ends here.

MainActivity内创建此方法(只需添加3个片段即可为您的应用提供先机。

private void addFragments(){
    adapter.addFragment(new SectionFragment());
    adapter.addFragment(new SectionFragment());
    adapter.addFragment(new SectionFragment());
}

然后修改您的SectionsPagerAdapter的{​​{1}}和getItem方法,如下所示:

getCount

现在,没有与“在列表中添加新片段”相关的工作需要在public class SectionsPagerAdapter extends FragmentPagerAdapter{ private boolean proceedStatus = false; private String requestURL = "xxxxxxxxxxxxxxxxxxxxxxxx"; //list of fragments need to be added dynamically public final ArrayList<Fragment> screens = new ArrayList<Fragment>(); public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return screens.get(position); } @Override public int getCount() { return screens.size(); } //This method will dynamically add a fragment each time it is called. public void addFragment(Fragment fragment) { screens.add(fragment); } 课程内完成。