web-dev-qa-db-fra.com

Comment forcer ViewPager à ré-instancier ses éléments

J'utilise ViewPager pour permettre à l'utilisateur de glisser entre ses vues. Existe-t-il un moyen de forcer cette ViewPager à recharger/ré-instancier ses vues au cas où elles ne seraient plus valides ou auraient besoin d'être actualisées? J'ai essayé d'appeler notifyDataSetChanged() sur son adaptateur mais cela n'invoque pas à nouveau la méthode instantiateItem().

MODIFIER

Voici la classe qui s'étend de ViewPager et de sa définition d’adaptateur. Ci-dessous, la méthode refresh() que j'appelle lorsque je souhaite forcer l'actualisation des éléments.

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();
}
}
123
gordonfreeman

J'ai trouvé une solution. C'est juste une solution de contournement à mon problème mais actuellement la seule solution.

ViewPager PagerAdapter ne met pas à jour la vue

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

Est-ce que quelqu'un sait s'il s'agit d'un bug ou non?

84
gordonfreeman

Avait le même problème. Pour moi ça a marché d'appeler

viewPage.setAdapter( adapter );

encore une fois ce qui a provoqué une nouvelle consolidation des pages.

154
Andi Droid
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();
}
}

essaye ça.

4
ngesh