在 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()方法无用

Android问题集:notifyDataSetChanged()方法无用

如何清空 Recyclerview数据