How to force ViewPager to re-instantiate its items

AndroidAndroid WidgetAndroid Viewpager

Android Problem Overview


I am using ViewPager to allow user to swipe between its views. Is there a way how to force this ViewPager to reload/re-instantiate its views in case that they are no longer valid or needs to be refreshed? I tried to call notifyDataSetChanged() on its adapter but this does not invoke instantiateItem() method again.

EDIT

Here is the class that extends from ViewPager and its adapter definision. Bellow is the refresh() method that I call when I want to force to refresh items.

public class DayFlipper extends ViewPager {

public class FlipperAdapter extends PagerAdapter {

	@Override
	public int getCount() {
		return DayFlipper.DAY_HISTORY;
	}

	@Override
	public void startUpdate(View container) {
	}

	@Override
	public Object instantiateItem(View container, int position) {
		Log.d(TAG, "instantiateItem(): " + position);

		Date d = DateHelper.getBot();
		for (int i = 0; i < position; i++) {
			d = DateHelper.getTomorrow(d);
		}

		d = DateHelper.normalize(d);

		CubbiesView cv = new CubbiesView(mContext);
		cv.setLifeDate(d);
		((ViewPager) container).addView(cv, 0);
		// add map
		cv.setCubbieMap(mMap);
		cv.initEntries(d);
		return cv;
	}

	@Override
	public void destroyItem(View container, int position, Object object) {
		((ViewPager) container).removeView((CubbiesView) object);
	}

	@Override
	public void finishUpdate(View container) {

	}

	@Override
	public boolean isViewFromObject(View view, Object object) {
		return view == ((CubbiesView) object);
	}

	@Override
	public Parcelable saveState() {
		return null;
	}

	@Override
	public void restoreState(Parcelable state, ClassLoader loader) {

	}

}
    
    ...
    
    public void refresh() {
    getAdapter().notifyDataSetChanged();
}
}

Android Solutions


Solution 1 - Android

Had the same problem. For me it worked to call

viewPage.setAdapter( adapter );

again which caused reinstantiating the pages again.

Solution 2 - Android

I have found a solution. It is just a workaround to my problem but currently the only solution.

https://stackoverflow.com/questions/7263291/viewpager-pageradapter-not-updating-the-view/7287121#7287121

public int getItemPosition(Object object) {
   return POSITION_NONE;
}

Does anyone know whether this is a bug or not?

Solution 3 - Android

public class DayFlipper extends ViewPager {

private Flipperadapter adapter;
public class FlipperAdapter extends PagerAdapter {

    @Override
    public int getCount() {
        return DayFlipper.DAY_HISTORY;
    }

    @Override
    public void startUpdate(View container) {
    }

    @Override
    public Object instantiateItem(View container, int position) {
        Log.d(TAG, "instantiateItem(): " + position);

        Date d = DateHelper.getBot();
        for (int i = 0; i < position; i++) {
            d = DateHelper.getTomorrow(d);
        }

        d = DateHelper.normalize(d);

        CubbiesView cv = new CubbiesView(mContext);
        cv.setLifeDate(d);
        ((ViewPager) container).addView(cv, 0);
        // add map
        cv.setCubbieMap(mMap);
        cv.initEntries(d);
adpter = FlipperAdapter.this;
        return cv;
    }

    @Override
    public void destroyItem(View container, int position, Object object) {
        ((ViewPager) container).removeView((CubbiesView) object);
    }

    @Override
    public void finishUpdate(View container) {

    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == ((CubbiesView) object);
    }

    @Override
    public Parcelable saveState() {
        return null;
    }

    @Override
    public void restoreState(Parcelable state, ClassLoader loader) {

    }

}

    ...

    public void refresh() {
    adapter().notifyDataSetChanged();
}
}

try this.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiongordonfreemanView Question on Stackoverflow
Solution 1 - AndroidAndi DroidView Answer on Stackoverflow
Solution 2 - AndroidgordonfreemanView Answer on Stackoverflow
Solution 3 - AndroidngeshView Answer on Stackoverflow