【问题标题】:ViewPager fragments handling a change处理更改的 ViewPager 片段
【发布时间】:2015-12-07 09:03:25
【问题描述】:

当viewpager显示一个fragment时,出于性能考虑,它会自动加载它周围的fragment页面。 在我的片段中,我有一个带有弹出菜单的循环视图,用于删除列表中的一项。

我面临从一个片段中删除一个项目的问题,但在我滚动到其他预加载片段后,该项目仍然存在于它们中。 只有当我通过手动来回滚动片段来强制 viewpager 重新加载其片段的内容时,它才有效。

有没有办法通过viewpager强制重新加载预加载的片段?

【问题讨论】:

  • 我刚刚在 5 秒前问了这个问题,它是如何被否决的????
  • 如何将您的项目 ID(或对象)传递给其他片段,并将其从他们的数据集中删除......而不是重新加载整个数据?
  • 我如何知道预加载了哪些片段,以及如何引用它们?

标签: android android-fragments android-viewpager android-recyclerview


【解决方案1】:

您的问题可以通过使用接口来解决。 Google 建议使用由您的主 Activity 管理的回调\侦听器在片段之间进行通信。您可以使用接口告诉另一个片段在您删除当前片段中的项目时刷新其列表视图。

概览http://developer.android.com/training/basics/fragments/communicating.html

关于这个How to pass data between fragments的问题也很好

【讨论】:

  • 我已经在使用回调在片段/活动之间进行通信。但是,我看到它如何解决问题。我的下一个问题是,要尝试一下,我如何通过 viewpager 引用 preloaded 片段以便能够与它们进行通信?
【解决方案2】:

首先创建一个接口来检测你的 RecyclerView 中的变化:

public interface MyRecyclerViewChangeListener(){
   void onRecyclerViewDataChanged(int id);
}

在您的 Fragment 或 Activity 中创建一个包含您的 viewpager 的静态变量:

public static List<MyRecyclerViewChangeListener> mListeners = new ArrayList();

实现您的 ViewPagerFragments 接口,并在您实现的方法中做您想做的事情。

在您的片段的 onResume 中,将您的侦听器注册到 mListener,例如打击以检测更改:

MyFragmentOrActivity.mListeners.add(this);

在你的片段的 onPause 中取消注册你的监听器:

MyFragmentOrActivity.mListeners.remove(this);

当你的 recyclerview 数据发生变化时,最后通知你的听众:

for(MyRecyclerViewChangeListener listener : mListeners){
    listener.onRecyclerViewDataChanged(id);
}

编辑 :如果您在异步任务结果(例如 web api 调用)后更改 recyclerview 的数据,您可以在片段的 onCreateView 方法中注册您的侦听器并在 onDestroyView 方法中取消注册。这样您就可以捕捉片段中的变化。

【讨论】:

  • 我确实发布了一个解决方案,但我没有写出我是如何做到的。谢谢你写下来!
【解决方案3】:

我不确定我的问题是否正确,但我认为应该这样做。

YourViewpager.setOffscreenPageLimit(0);

现在片段如果不活动应该被销毁,如果再次打开它会重新创建。所以应该识别数据更改。

希望我能帮上忙

【讨论】:

  • 不起作用 .setOffScreenPageLimit(0) 与 (1) 相同,因为它不能小于 1,而 1 表示在当前显示的页面之前/之后预加载 1 个页面跨度>
  • 您是否尝试过使用“addOnPageChangeListener”?
【解决方案4】:

尝试设置mViewPager.setOffscreenPageLimit(1),使其不会预先缓存任何片段,或者您可以在viewPager 中使用FragmentStatePagerAdapter 来实现您想要的。

编辑 1: 所以结论是: 1) 使用本地广播机制更新 ViewPager 适配器中的片段

2) 使用处理机制刷新这些片段

3) 如果您想在这些片段对用户可见时盲目更新它们,请在视图分页器方法的 onPageChangeListener 中执行。

【讨论】:

  • 没用,我一开始也是这么想的。不幸的是, mViewPager.setOffscreenPageLimit(1) 意味着它将在当前显示之前/之后预加载 1 个页面。 FragmentStatePagerAdapter 也是如此,根据文档,“当页面对用户不可见时,它们的整个片段 MAY 被销毁”这意味着它也可能被销毁,尤其是当动作刚刚发生并且用户立即滚动到下一个片段时
  • @RJFares :您希望您的片段在用户可见时立即刷新?
  • 我希望在可见片段上调用 ​​deleteItem() 后,预加载的片段(围绕当前可见片段)刷新
  • RJFares :正如@Sunny 所建议的,您有以下选项:1)将本地广播发送到其他片段,因此他们将更新它们。 2)有一些处理程序负责刷新这些片段。3)无论是否需要刷新这些片段,只要用户可见就盲目更新片段。
【解决方案5】:

这些答案帮助我找到了解决方案。

为了以后参考,我每次使用deleteItem()时都使用了一个回调,并通过使用方法[FragmentHostingViewPager].getChildFragmentManager().getFragments()获取加载的frags列表

然后我遍历每个片段只要每个片段不为空,并在它们上调用refresh() 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    相关资源
    最近更新 更多