I am using ViewPager
to display simple fragments containing a quote and its author. I want to be able to add more quotes to the ArrayList
behind the view pager when the user is 4 quotes away from the end of the list. The new quotes are acquired by making HTTP requests to a web api. The quotes are being fetched at the right time but when I try and call notifyDataSetChanged()
on ViewPager's adapter I get the following exception:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentTransaction android.support.v4.app.FragmentTransaction.add(int, android.support.v4.app.Fragment)' on a null object reference at android.support.v4.app.FragmentStatePagerAdapter.instantiateItem(FragmentStatePagerAdapter.java:119) at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:836) at android.support.v4.view.ViewPager.populate(ViewPager.java:1052) at android.support.v4.view.ViewPager.populate(ViewPager.java:918) at android.support.v4.view.ViewPager$3.run(ViewPager.java:248) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) at android.view.Choreographer.doCallbacks(Choreographer.java:580) at android.view.Choreographer.doFrame(Choreographer.java:549) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5257) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
What is the right way to add more data to ViewPager's model? Or should a new ViewPager be created for new data?
Code for reference:
public class QuotesPageActivity extends FragmentActivity {
private ViewPager mViewPager;
private ArrayList<Quote> mQuotes;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Allows thread to make call to api not on the network in HttpRequestTask
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
//Set up view Pager
mViewPager = new ViewPager(this);
mViewPager.setId(R.id.viewPager);
setContentView(mViewPager);
// Get list of quotes
mQuotes = QuoteCollection.get(this).getQuotes();
//Set up fragment manager
FragmentManager fm = getSupportFragmentManager();
//Configure adapter
mViewPager.setAdapter(new FragmentStatePagerAdapter(fm) {
@Override
public Fragment getItem(int position) {
// Get more quotes if nearing the end
if (position > mQuotes.size() - 5) {
getMoreQuotes();
}
return QuotesPageFragment.newInstance(position);
}
@Override
public int getCount() {
return mQuotes.size();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
});
}
public void getMoreQuotes() {
// Fetch 5 more quotes from web api and add them to mQuotes
QuoteCollection.get(this).addMoreQuotes(5);
mViewPager.getAdapter().notifyDataSetChanged();
}
}