在 notifyDataSetChanged 之后 FragmentStateAdapter 没有重新创建 currentFragment
Posted
技术标签:
【中文标题】在 notifyDataSetChanged 之后 FragmentStateAdapter 没有重新创建 currentFragment【英文标题】:FragmentStateAdapter not recreating currentFragment after notifyDataSetChanged 【发布时间】:2020-07-12 13:01:43 【问题描述】:我有一个 FragmentStateAdapter 作为 ViewPager2 的适配器。
class DefaultFragmentStateAdapter(fragment: Fragment) : FragmentStateAdapter(fragment)
var items = listOf<Fragment>()
set(value)
field = value
notifyDateSetChanged()
override fun getItemCount(): Int = items.size
override fun createFragment(position: Int): Fragment = items[position]
适配器项可以根据用户选择的日期而改变,因此它需要是动态的。
发生的情况是,在我调用adapter.items = new_fragments
后,当前片段没有重新加载,只有在我转到 ViewPager 中的最后一个页面并返回第一页后,我才能看到更新的片段。
调用notifyDataSetChanged
时,当前片段不会更新。
如何更新当前显示的片段?
【问题讨论】:
【参考方案1】:我不得不重写以下两个方法...
override fun getItemId(position: Int): Long
return items[position].id
override fun containsItem(itemId: Long): Boolean = items.any it.id == itemId
...让它工作!
【讨论】:
return items[position].id 需要一个 long 值 我不知道为什么,但是覆盖 getItemId() 和 containsItem() 会使片段加载两次。 我也需要了解原因。 它对我有用。非常感谢!【参考方案2】:我找到的最好方法是setUserVisibleHint
将此添加到您的片段中
@Override
public void setUserVisibleHint(boolean isVisibleToUser)
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser)
// load data here
else
// fragment is no longer visible
【讨论】:
根据文档,页面限制必须大于 1,否则会引发异常! 对不起,我用 5 的时候有什么效果,这里是更新 @JamaldinSabirjanov,我不清楚为什么覆盖 Fragment 的setUserVisibleHint(isVisibleToUser:)
方法将解决 FragmentStateAdapter
中的问题。尽管如此,出于好奇,我确实覆盖了它并观察到它在FragmentStateAdapter.notifyDataSetChanged()
调用之前或之后从未被调用过。请解释为什么或如何解决这个问题。在尝试使用这种标记为已弃用的方法时,我也注意到了这一点。见here。以上是关于在 notifyDataSetChanged 之后 FragmentStateAdapter 没有重新创建 currentFragment的主要内容,如果未能解决你的问题,请参考以下文章
在 notifyDataSetChanged 之后 FragmentStateAdapter 没有重新创建 currentFragment
RecyclerView 在 NotifyDataSetChanged() 之后没有更新,打开和关闭屏幕后显示内容
转载:从源代码的角度分析--在BaseAdapter调用notifyDataSetChanged()之后发生了什么
Android问题集:notifyDataSetChanged()方法无用