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

我使用了异步任务从Web服务中提取数据。但是,在我的异步任务之前执行了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());
            }
        }
    }
}

最佳答案

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

如果您希望获得更详细的说明,请发布FragmentPagerAdapter实现。

关于java - FragmentPagerAdapter动态选项卡和页数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24887083/

10-09 20:40