كيفية إجبار ViewPager على إعادة إنشاء عناصره [نسخة مكررة]

StackOverflow https://stackoverflow.com/questions/7369978

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

انا استخدم ViewPager للسماح للمستخدم بالتمرير بين وجهات نظره.هل هناك طريقة لكيفية فرض هذا ViewPager لإعادة تحميل/إعادة إنشاء مشاهداتها في حالة أنها لم تعد صالحة أو تحتاج إلى التحديث؟حاولت الاتصال notifyDataSetChanged() على محوله ولكن هذا لا يستدعي instantiateItem() الطريقة مرة أخرى.

يحرر

هذه هي الفئة التي تمتد من ViewPager وتعريف المحول الخاص بها.أدناه هو refresh() الطريقة التي أسميها عندما أرغب في فرض تحديث العناصر.

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();
}
}
هل كانت مفيدة؟

المحلول 2

لقد وجدت الحل.إنه مجرد حل بديل لمشكلتي ولكنه الحل الوحيد حاليًا.

لا يقوم ViewPager PagerAdapter بتحديث طريقة العرض

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

هل يعرف أحد ما إذا كان هذا خطأ أم لا؟

نصائح أخرى

كان لديه نفس المشكلة.بالنسبة لي عملت على الاتصال

viewPage.setAdapter( adapter );

مرة أخرى مما تسبب في إعادة تشغيل الصفحات مرة أخرى.

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

جرب هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top