2

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();
    }
}
Samson
  • 54
  • 5

0 Answers0