【问题标题】:How to reload and refresh fragment when changing position in FragmentPagerAdapter?在 FragmentPagerAdapter 中更改位置时如何重新加载和刷新片段?
【发布时间】:2017-09-20 07:27:17
【问题描述】:

每次在 FragmentPagerAdapter 内部切换时,我都需要重新加载操作并刷新 fragment 我已经看到来自

的引用

ViewPager PagerAdapter not updating the View

How to refresh a Fragment of a FragmentPagerAdapter?

我的 FragmentPagerAdapter

public class SickAdapterApproval extends FragmentPagerAdapter{

    private static final int FRAGMENT_COUNT = 4;

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

    @Override
    public Fragment getItem(int position) {
        switch (position){
            case 0:
                return new SickFragmentToAll();
            case 1:
                return new SickFragmentToPending();
            case 2:
                return new SickFragmentToApproved();
            case 3:
                return new SickFragmentToDenied();
        }
        return null;
    }

    @Override
    public int getCount() {
        return FRAGMENT_COUNT;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position){
            case 0:
                return "All";
            case 1:
                return "Pending";
            case 2:
                return "Approved";
            case 3:
                return "Denied";
        }
        return null;
    }
}

但我还是卡住了,不明白,有没有人可以给我解释一下并举个例子?

【问题讨论】:

  • 您只是想重新加载一个已经存在的 PagerAdapter 项目,还是希望 PagerAdapter 在您弄乱适配器内的项目数量(添加或删除)后刷新?
  • @KalaBalik 我想刷新片段,因为片段的内容从 json 加载数据,我希望每次替换片段时,重新加载片段以便从 json 获取最新数据

标签: android android-fragments


【解决方案1】:

使用 `FragmentStatePageAdapter 更改 FragmentPageAdapter

并覆盖此方法:

@Override
public int getItemPosition(Object object) {
//FragmentLeft is the class for the first fragment in the view
//recreate only FragmentLeft
    if (object instanceof FragmentLeft) {
        return POSITION_NONE;
    }
    return 1;
}

【讨论】:

  • 可以,只需在 Fragment Class 上将 FragmentPageAdapter 更改为 FragmentStatePageAdapter,但是 FragmentPageAdapterFragmentStatePageAdapter 有什么不同?
  • 但是FragmentPageAdapterFragmentStatePageAdapter 有什么不同
  • 在调用 notifyDataSetChanged() 时,适配器会调用它所附加的 ViewPager 的 notifyChanged() 方法。 ViewPager 然后检查适配器的 getItemPosition() 为每个项目返回的值,删除那些返回 POSITION_NONE 的项目(参见源代码),然后重新填充。
  • 但我只是将 FragmentPageAdapter 替换为 FragmentStatePageAdapter 就可以了,我没有添加 getItemPosition,这是怎么回事?
  • 能否将其标记为已接受的答案,您可以阅读 Android 开发者指南中的差异
【解决方案2】:

如果你只想刷新现有片段的内容,notifyDataSetChanged() 和适配器都不参与解决方案。您需要确保您使用数据提供的视图得到刷新。见我的source:

notifyDatasetChanged() 方法不用于刷新当前显示的 Fragment 或其视图。如果您希望在某些数据发生更改时刷新视图,则需要向 Fragment 添加一些侦听器/回调。

【讨论】:

  • 但我只是将 FragmentPageAdapter 替换为 FragmentStatePageAdapter 就可以了,我没有添加 getItemPosition,这是怎么回事?
  • 您应该检查片段是否被重新创建(例如,在片段的 onCreate() 方法中放置一个日志)。如果没有,你很好。
猜你喜欢
  • 1970-01-01
  • 2013-09-13
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多