【问题标题】:How to force ViewPager to re-instantiate its items [duplicate]如何强制 ViewPager 重新实例化其项目 [重复]
【发布时间】:2011-11-14 06:14:56
【问题描述】:

我使用ViewPager 允许用户在其视图之间滑动。有没有办法强制ViewPager 重新加载/重新实例化其视图,以防它们不再有效或需要刷新?我尝试在其适配器上调用notifyDataSetChanged(),但这不会再次调用instantiateItem() 方法。

编辑

这是从 ViewPager 及其适配器定义扩展而来的类。 Bellow 是我想强制刷新项目时调用的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();
}
}

【问题讨论】:

  • notifyDataSetChanged().. 应该这样做。你能发布一些代码吗..
  • 我添加了代码 sn-p。希望对您有所帮助。
  • 有人可以帮忙吗?
  • 我出现这个问题的原因 - 我的 destroyItem() 方法中有一个不正确的类(教程代码遗留下来的) - 所以视图永远不会被破坏。
  • 当我刷新 viewpagers 数据时,前两个 view pager 没有刷新,其他 view pager 数据正在改变。请帮帮我

标签: android android-widget android-viewpager


【解决方案1】:

我找到了解决办法。这只是我的问题的一种解决方法,但目前是唯一的解决方案。

ViewPager PagerAdapter not updating the View

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

有人知道这是否是一个错误吗?

【讨论】:

  • 不是真的; getItemPosition 用于通知ViewPager 是否刷新项目,如果可见位置的项目没有改变,则避免更新。这里的“错误”是从客户端代码刷新可见项目的不明显和/或不存在的解决方案。
  • 这听起来像是您需要的,因为此代码中没有错误。您基本上只是说在数据集发生更改时需要更新每个项目。我要说的唯一区别是,如果您只想更新特定页面,这将需要更多的逻辑。
  • 对于这个答案,请从“gord”中删除 r ..thanku man.
  • 当我刷新 viewpagers 数据时,前两个 view pager 没有刷新,其他 view pager 数据正在改变。请帮帮我
  • 这会导致 java.lang.IllegalStateException: FragmentManager 已经在执行事务
【解决方案2】:

遇到了同样的问题。对我来说,它可以调用

viewPage.setAdapter( adapter );

再次导致重新实例化页面。

【讨论】:

  • 不确定我是否喜欢这种方法,但它也对我有用。
  • viewPager.setAdapter(null) 将清除所有页面。
  • 上帝保佑你!我几乎为这个愚蠢的问题浪费了两个小时:)
  • 当我刷新 viewpagers 数据时,前两个 view pager 没有刷新,其他 view pager 数据正在改变。请帮帮我
  • 这对我来说是真正的答案。
【解决方案3】:
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();
}
}

试试这个。

【讨论】:

  • 这对我不起作用。只是为了确保我们在同一页面上。我在ViewPager 中选择了可滚动浏览的x 页之一。从菜单中,我调用以某种方式处理底层数据库中的数据并更改它的操作。在该页面上,我正在展示该数据。通过我在菜单中触发的数据已更改的过程。因此,我想将这种变化反映到我正在查看的页面上。如果我从当前页面滚动 2 页然后返回实际页面,则会反映出这一点,因为 instantiateItem() 被触发,但我想在不滚动的情况下执行此操作。
  • 重写 instantiateItem() 非常适合您删除片段然后想将其添加回来的情况。我发现这对我遇到的另一个问题很有用,但对这个问题没有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 2023-03-27
  • 2011-10-24
  • 2022-08-08
  • 2019-09-19
相关资源
最近更新 更多