0

I am absolutely new to Android programming and I am having difficulty in getting this to work (i am fairly close, but I am missing something important).

I have an Activity called PatientPagerActivity, which pages through Fragments of Patient information. In each PatientFragment, I have a button, when clicked, will provide besides the patient information, some miscellaneous information as well. So what I was planning to do in PatientPagerActivity was to replace PatientFragment with PatientWithMiscFragment (That has the Patient information and the miscellaneous part).

The activity_pager.xml file:

<android.support.v4.view.ViewPager 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/viewPager"
  android:layout_width="match_parent"
  android:layout_height="match_parent" />

PatientPagerActivity file:

public class PatientPagerActivity extends FragmentActivity
implements PatientPagerActivityCallbacks {
private ViewPager mViewPager;
private List<Patient> mQuizProblemList;

private int mCurrentIndex;
private List<PatientFragment> mPatientFragmentList;
private List<PatientWithMiscFragment> mPatientWithMiscFragmentList;

private static final String EMPTY_TEXT = "";


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_pager);

    mViewPager = (ViewPager) findViewById(R.id.viewPager);

    mPatientList = 
               PatientManager.getInstance(this).getPatients();

    FragmentManager fm = getSupportFragmentManager();
    mViewPager.setAdapter(new FragmentStatePagerAdapter(fm) {
        @Override
        public int getCount() {
            return mPatientList.size();
        }

        @Override
        public Fragment getItem(int location) {
            Patient patient = mPatientList.get(location);
            PatientFragment fragment = 
                                    PatientFragment.newInstance(patient);
            PatientWithMiscFragment miscFragment = 
                                    PatientWithMiscFragment.newInstance(patient);

            if(mPatientFragmentList== null) {
                mPatientFragmentList = 
                                          new ArrayList<PatientFragment>();
            }
            mPatientFragmentist.add(fragment);

            if(mPatientWithMiscFragmentList == null) {
                mPatientWithMiscFragmentList = 
                                       new ArrayList<PatientWithMiscFragment>();
            }
            mPatientWithMiscFragmentList.add(miscFragment);

            return fragment;
        }
    });

    mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageSelected(int counter) {
            setTitle("Patient: " + (counter + 1));
            mCurrentIndex = counter;
        }

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

        @Override
        public void onPageScrollStateChanged(int arg0) {
            hideMiscInformation();
        }
    });

    long patientID =
                   getIntent().getLongExtra(PatientFragment.EXTRA_PATIENT_ID, -1);
    for(int counter = 0; counter < mPatientList.size(); counter++) {
        if(mPatientList.get(counter).getPatient().getID() == patientID) {
            mViewPager.setCurrentItem(counter);
            setTitle("Patient: " + (counter + 1));
            mCurrentIndex = counter;
            break;
        }
    }
}

@Override
public void onMiscSelected() {
    if(findViewById(R.id.viewPager) != null) {
        FragmentManager fm  = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();

                    //Find the current PatientInformation
        Fragment oldFragment = mPatientFragmentList.get(mCurrentIndex);
        //And Remove it 
        if(oldFragment != null) {
            ft.remove(oldFragment);
            ft.commit();
        }
                    //Notify the adapter that data set has changed.
        notifyAdapterDataSetChanged();

        ft = fm.beginTransaction();
                    //Replace it with the corresponding fragment that also has misc
        ft.add(R.id.viewPager,
                           mPatientWithMiscFragmentList.get(mCurrentIndex));
        ft.commit();    
        notifyAdapterDataSetChanged();
    }
}

public void hideMiscInformation() {
    if(findViewById(R.id.viewPager) != null) {
        FragmentManager fm  = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();

        //Remove the misc information
        Fragment oldMiscFragment =
                         fm.findFragmentById(R.id.viewPager);           
        if(oldMiscFragment != null) {
            ft.remove(oldMiscFragment);
            ft.commit();
        }
                    //Replace it with ONLY the patient information.
                    ft = fm.beginTransaction();
        ft.add(R.id.viewPager, mPatientFragmentList.get(mCurrentIndex));
        ft.commit();
        notifyAdapterDataSetChanged();
    }
}
    :
    :
}

When the user is interested in the miscellaneous information, a callback happens to the PagerActivity and the onMiscSelected() will replace the PatientFragment with PatientWithMiscFragment. However, in my case this is not happening.

Please help me in identifying where I am going wrong.

Thank you!

user2808089
  • 49
  • 1
  • 5

2 Answers2

0

As has been documented in other posts, when you are dealing with FragmentStatePageAdapter, you would need to take care of the following: 1. After you replace an old fragment with a new fragment, inform the adapter that the underlying data has changed by invoking FragmentStatePageAdapter.notifyDataSetChanged(). 2. You would need to override the getItemPosition(). In this method if the fragment located in a particular position was not changed and if you return POSITION_NONE, you will get incorrect result.

The code with the changes is as follows:

public class PatientPagerActivity extends FragmentActivity implements PatientPagerActivityCallbacks {
    private ViewPager mViewPager;
    private List<Patient> mPatientList;

    private int mCurrentIndex;
    private List<PatientFragment> mPatientFragmentList;
    private List<PatientWithMiscFragment> mPatientWithMiscFragmentList;

    private static final String EMPTY_TEXT = "";


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pager);

        mViewPager = (ViewPager) findViewById(R.id.viewPager);

        mPatientList = 
                PatientManager.getInstance(this).getPatients();

        FragmentManager fm = getSupportFragmentManager();
        mViewPager.setAdapter(new FragmentStatePagerAdapter(fm) {
            @Override
            public int getCount() {
                return mPatientList.size();
            }

            @Override
            public Fragment getItem(int location) {
                Patient patient = mPatientList.get(location);
                PatientFragment fragment = 
                        PatientFragment.newInstance(patient);
                PatientWithMiscFragment miscFragment = 
                        PatientWithMiscFragment.newInstance(patient);

                if(mPatientFragmentList== null) {
                    mPatientFragmentList = 
                            new ArrayList<PatientFragment>();
                }
                mPatientFragmentist.add(location, fragment);

                if(mPatientWithMiscFragmentList == null) {
                    mPatientWithMiscFragmentList = 
                            new ArrayList<PatientWithMiscFragment>();
                }
                mPatientWithMiscFragmentList.add(location, miscFragment);

                return fragment;
            }
            @Override
            public int getItemPosition(Object object) {
                PatientFragment fragment = (PatientFragment) object;
                if(mPatientFragmentList.get(mCurrentIndex).getCurrentPatient() != null && 
                    fragment.getCurrentPatient().getID().
                        equals(mPatientFragmentList.get(
                        mCurrentIndex).getCurrentPatient().getID())) {
                    return POSITION_NONE;
                } else if(mPatientFragmentList.get(mCurrentIndex).getCurrentPatient() == null) {
                    return POSITION_NONE;
                } else {
                    return POSITION_UNCHANGED;
                }

            }
        });

        mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageSelected(int counter) {
                setTitle("Patient: " + (counter + 1));
                mCurrentIndex = counter;
            }

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

            @Override
            public void onPageScrollStateChanged(int arg0) {
                hideMiscInformation();
            }
        });

        long patientID =
                getIntent().getLongExtra(PatientFragment.EXTRA_PATIENT_ID, -1);
        for(int counter = 0; counter < mPatientList.size(); counter++) {
            if(mPatientList.get(counter).getPatient().getID() == patientID) {
                mViewPager.setCurrentItem(counter);
                setTitle("Patient: " + (counter + 1));
                mCurrentIndex = counter;
                break;
            }
        }
    }

    @Override
    public void onMiscSelected() {
        if(findViewById(R.id.viewPager) != null) {
            FragmentManager fm  = getSupportFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();

            //Find the current PatientInformation
            Fragment oldFragment = mPatientFragmentList.get(mCurrentIndex);
            //And Remove it 
            if(oldFragment != null) {
                ft.remove(oldFragment);
                ft.commit();
            }


            ft = fm.beginTransaction();
            //Replace it with the corresponding fragment that also has misc
            ft.add(R.id.viewPager,
                    mPatientWithMiscFragmentList.get(mCurrentIndex));
            ft.commit();    
            notifyAdapterDataSetChanged();
        }
    }

    public void hideMiscInformation() {
        if(findViewById(R.id.viewPager) != null) {
            FragmentManager fm  = getSupportFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();

            //Remove the misc information
            Fragment oldMiscFragment =
                    fm.findFragmentById(R.id.viewPager);           
            if(oldMiscFragment != null) {
                ft.remove(oldMiscFragment);
                ft.commit();
            }
            //Replace it with ONLY the patient information.
            ft = fm.beginTransaction();
            ft.add(R.id.viewPager, mPatientFragmentList.get(mCurrentIndex));
            ft.commit();
            notifyAdapterDataSetChanged();
        }
    }

}
user2808089
  • 49
  • 1
  • 5
-1

You can use a simple "FrameLayout" to inflate it with yours fragment. So the newest fragment will replace the previous.

here is a example

Good luck!

Reiksiel
  • 146
  • 1
  • 1
  • 8
  • Reiksiel, are you suggesting this as the viewpager xml: – user2808089 Oct 14 '13 at 18:39
  • And how is this framelayout used. I might be wrong, but I thought the FragmentStatePageAdapter manages all the fragments. And these fragments are returned by getItem(int location). – user2808089 Oct 14 '13 at 18:47
  • Sorry, i was not clear. Get the [sample](http://developer.android.com/shareables/training/NavigationDrawer.zip) to see the FrameLayout in action. This layout is the simplest each child will added like a stack one overlapping the other, you can use this behaviour to add fragment at runtime. I know nothing about FragmentStatePageAdapter sorry I am just showing you a solution that i used. If you dont understand the example i will help ok? Good Luck – Reiksiel Oct 14 '13 at 22:45
  • Thank you Reiksiel. I believe FragmentStatePageAdapter works a little different, but your solution will help me if I have issues with drawer. I got my stuff to work. I will post the solution later in the day. – user2808089 Oct 15 '13 at 12:24