【问题标题】:FragmentStateAdapter not recreating currentFragment after notifyDataSetChanged在 notifyDataSetChanged 之后 FragmentStateAdapter 没有重新创建 currentFragment
【发布时间】: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 时,当前片段不会更新。

如何更新当前显示的片段?

【问题讨论】:

    标签: android android-fragments android-viewpager2


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2021-06-01
    • 2015-08-13
    • 2020-11-02
    • 1970-01-01
    • 2016-02-09
    • 2015-08-31
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多