Android 处理更改的ViewPager片段

Android 处理更改的ViewPager片段,android,android-fragments,android-viewpager,android-recyclerview,Android,Android Fragments,Android Viewpager,Android Recyclerview,当viewpager显示一个片段时,出于性能原因,它将自动加载其周围的片段页面。 在我的片段中,我使用带有弹出菜单的RecycleView删除列表中的一项 我面临从一个片段中删除一个项目的问题,但在滚动到其他预加载的片段后,该项目仍然存在。 只有当我通过手动来回滚动片段来强制viewpager重新加载其片段的内容时,它才起作用 有没有办法通过viewpager强制重新加载预加载的片段?尝试设置mViewPager.setOffscreenPageLimit(1),这样它就不会预缓存任何片段,或者

当viewpager显示一个片段时,出于性能原因,它将自动加载其周围的片段页面。 在我的片段中,我使用带有弹出菜单的RecycleView删除列表中的一项

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


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

尝试设置
mViewPager.setOffscreenPageLimit(1)
,这样它就不会预缓存任何片段,或者您可以在
viewpager
中使用
FragmentStatePagerAdapter
来实现您想要的功能

编辑1: 因此,结论是: 1) 使用本地广播机制更新ViewPager适配器中存在的片段

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


3) 如果你想在用户看到这些片段后盲目地更新它们,那么就在查看寻呼机方法的onPageChangeListener中进行更新。

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

YourViewpager.setOffscreenPageLimit(0);
现在,如果该片段不处于活动状态,则应将其销毁,如果再次打开它,则将重新创建该片段。因此,应识别数据更改


希望我能帮助你

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

有关概述


关于这一点还有一个好问题,首先创建一个界面来检测RecyclerView中的更改:

public interface MyRecyclerViewChangeListener(){
   void onRecyclerViewDataChanged(int id);
}
在包含viewpager的片段或活动中创建静态变量:

public static List<MyRecyclerViewChangeListener> mListeners = new ArrayList();
在片段的onPause中取消注册您的侦听器:

MyFragmentOrActivity.mListeners.remove(this);
最后,当您的recyclerview数据更改时通知您的侦听器:

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

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

答案帮助我找到了解决方案

为了将来的参考,我每次使用
deleteItem()
,都会使用回调,并使用方法
[FragmentHostingViewPager].getChildFragmentManager().getFragments()


然后,只要每个片段不为null,我就遍历每个片段,并对其调用
refresh()
方法。

我5秒钟前就直接问了这个问题,它是如何被否决的???将您的项目id(或对象)传递给其他片段,然后从它们的数据集中删除它怎么样。。。不是重新加载整个数据?我如何知道预加载了哪些片段以及如何引用它们?不起作用。setOffScreenPageLimit(0)与(1)相同,因为它不能小于1,1表示它在当前显示的片段之前/之后预加载1页。您是否尝试使用“addOnPageChangeListener”?不起作用,我最初也有同样的想法。不幸的是,mViewPager.setOffscreenPageLimit(1)意味着它将在当前页面显示之前/之后预加载1页。同样的事情也适用于FragmentStatePagerAdapter,根据文档,“当用户看不到页面时,其整个片段可能会被销毁”,这意味着它很可能不会被销毁,特别是如果操作刚刚发生,用户立即滚动到下一个fragment@RJFares:是否希望您的片段在用户可见时立即刷新?我希望在调用deleteItem()后,预加载的片段(围绕当前可见的片段)刷新根据@Sunny的建议,您有以下选项:1)向其他片段发送本地广播,相应地,他们将更新这些片段。2) 有一些处理程序负责刷新这些片段。3)只要用户看到片段,不管是否需要刷新这些片段,都会立即盲目更新片段。我已经在使用回调在片段/活动之间进行通信。然而,我看到它可以解决这个问题。我的下一个问题是,如何通过viewpager引用预加载的片段来与它们进行通信?请查看此页面我确实发布了一个解决方案,但我没有写我是如何做到的。谢谢你写下来!
for(MyRecyclerViewChangeListener listener : mListeners){
    listener.onRecyclerViewDataChanged(id);
}