如何使用 Tablayout 清除 Viewpager 的缓存内存

Posted

技术标签:

【中文标题】如何使用 Tablayout 清除 Viewpager 的缓存内存【英文标题】:How to clear the cached memory of Viewpager with Tablayout 【发布时间】:2016-06-23 11:43:12 【问题描述】:

我刚开始使用 Material Design 的 ViewPager 和 Tablayout(android Studio 附带)。我创建了 5 个片段,我可以根据需要使用它们。

根据 Fragment2 中的用户选择,我想删除 Fragment3。但是,在从选项卡布局中删除选项卡后,当滑动到第 3 个选项卡(这是删除第 3 个选项卡之前的第 4 个选项卡)时,会显示错误的片段 - 系统在内存中有第 3 个片段并显示它。 如果我销毁该片段,则会收到有关“无法更改片段标签”的异常。

如何告诉系统不使用第三个片段或将其从内存中删除,直到我需要它,然后将其重新加载到内存中。

【问题讨论】:

@Milan 解决方案有效,无需使用 destoryItem()。 【参考方案1】:

你在使用 FragmentPagerAdapter 吗?如果是这样,您可能想尝试FragmentStatePagerAdapter。因为它会破坏未使用的碎片。 如果没有,请提供一些代码,以便我们更深入地研究。

【讨论】:

我正在使用 FragmentPagerAdapter。我去阅读 FragmentStatePagerAdapter 并且我知道它不会将片段保留在内存中,但我看不出它有什么帮助,因为它确实将片段的状态保留在内存中,所以它会记住已删除的片段。有没有办法告诉 ViewPager 片段列表已更改并忽略已删除的片段? 我现在看到它有一个destroyItem()方法。我试试看 destroyItem() 有参数容器、位置和对象。我知道我可以使用“this”作为容器,但是对象呢,我从哪里获得它的价值?我不清楚如何调用此方法。 FragmentStatePagerAdapter 的作用就像魅力一样,对内存优化也有好处,爱你!【参考方案2】:

我也遇到了同样的问题,就是虽然我更新了adapter的数据,但是view还是没有更新!但是,我发现,一旦我更新了适配器的数据并调用了.notifDataSetChange(),我又调用了.setsAdapter(m_PagerAdapter)。这对我有用:) ...

//
// update the data of adapter ...
//
m_PagerAdapter.notifyDataSetChanged();
m_vpgItems.setAdapter(m_PagerAdapter);

【讨论】:

以上是关于如何使用 Tablayout 清除 Viewpager 的缓存内存的主要内容,如果未能解决你的问题,请参考以下文章

Android开发问题笔记

自适应 Tab 宽度可以滑动文字逐渐变色的 TabLayout(仿今日头条顶部导航)

片段中的Tablayout + viewpager,需要清除viewpager中的edittext数据

Android Studio 无法解析符号“TabLayout”

以编程方式设置 ViewPager 高度会自动滚动到最底部

如何在 Android 中使用 TabLayout 和 ViewPager2