Android 处理更改的ViewPager片段
当viewpager显示一个片段时,出于性能原因,它将自动加载其周围的片段页面。 在我的片段中,我使用带有弹出菜单的RecycleView删除列表中的一项 我面临从一个片段中删除一个项目的问题,但在滚动到其他预加载的片段后,该项目仍然存在。 只有当我通过手动来回滚动片段来强制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强制重新加载预加载的片段?尝试设置
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);
}