anticafe
anticafe

Reputation: 6892

Cannot refresh ViewPager content

This code is very simple. I have a ViewPager with several Fragment inside. And a "Add new pager" button to add new pager to the first position of ViewPager.

Here is my code

public class TestPagerActivity extends SherlockFragmentActivity {

    private ArrayList<String> mData = new ArrayList<String>();
    private ViewPager mPager;
    private TestPagerAdapter mAdapter;

    @Override
    protected void onCreate(Bundle b) {
        // TODO Auto-generated method stub
        super.onCreate(b);
        setContentView(R.layout.testpager);

        mData.add("Looking");
        mData.add("into");
        mData.add("your");
        mData.add("dark");
        mData.add("blue");
        mData.add("eyes");
        mPager = (ViewPager) findViewById(R.id.pager);
        mAdapter = new TestPagerAdapter(getSupportFragmentManager(), mData);
        mPager.setAdapter(mAdapter);
    }

    public void onAddNewPagerClick(View v) {
        mData.add(0, "When");
        mAdapter.notifyDataSetChanged();
        mPager.invalidate();
    }

    public static class TestPagerAdapter extends FragmentStatePagerAdapter {

        private List<String> mData;

        public TestPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        public TestPagerAdapter(FragmentManager fm, List<String> data) {
            super(fm);
            mData = data;
        }

        public void updateAdapter(List<String> data) {
            mData = data;
            notifyDataSetChanged();
        }

        @Override
        public Fragment getItem(int position) {
            return TestFragment.newInstance(mData.get(position), position + "/" + mData.size());
        }

        @Override
        public int getCount() {
            return mData.size();
        }

    }

    public static class TestFragment extends SherlockFragment {
        private static final String KEY_CONTENT = "TestFragment:Content";
        private static final String KEY_POSITION = "TestFragment:Position";

        public static TestFragment newInstance(String content, String position) {
            TestFragment fragment = new TestFragment();

            StringBuilder builder = new StringBuilder();
            builder.append("Page ").append(position).append("\n");
            for (int i = 0; i < 20; i++) {
                builder.append(content).append(" ");
            }
            builder.deleteCharAt(builder.length() - 1);
            fragment.mContent = builder.toString();

            return fragment;
        }

        private String mContent = "???";
        private String mPosition = "x/y";

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            if ((savedInstanceState != null) && savedInstanceState.containsKey(KEY_CONTENT)) {
                mContent = savedInstanceState.getString(KEY_CONTENT);
                mPosition = savedInstanceState.getString(KEY_POSITION);
            }
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            TextView text = new TextView(getActivity());
            text.setGravity(Gravity.CENTER);
            text.setText(mContent);
            text.setTextSize(20 * getResources().getDisplayMetrics().density);
            text.setPadding(20, 20, 20, 20);

            LinearLayout layout = new LinearLayout(getActivity());
            layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
            layout.setGravity(Gravity.CENTER);
            layout.addView(text);

            return layout;
        }

        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putString(KEY_CONTENT, mContent);
            outState.putString(KEY_POSITION, mPosition);
        }
    }
}

The problem is: when I refresh the ViewPager after adding a new pager, its content doesn't display correctly. At the beginning, I have 6 pages, but after adding a new one, there are still 6 pages displayed here while I expect 7 pages.

Can anyone tell me what's wrong here? Thanks for any advise.

Upvotes: 0

Views: 1483

Answers (2)

Yogendra
Yogendra

Reputation: 5260

avoid FragmentPagerAdapter and use FragmentStatePagerAdapter.

I hope it will work for you also.

Upvotes: 0

adamp
adamp

Reputation: 28932

The first thing that stands out is that you're inserting new items at the front of your list of pages, yet you haven't implemented the PagerAdapter method getItemPosition(Object) to tell the ViewPager where pages have moved after a data set change. As the method's documentation states, the default implementation reports that pages never change positions. A ViewPager with pages that change position will not behave properly if your adapter does not correctly implement this method.

Upvotes: 2

Related Questions