【问题标题】:How to change fragment inside getItem of FragmentStatePagerAdapter如何更改 FragmentStatePagerAdapter 的 getItem 内的片段
【发布时间】:2019-08-12 08:30:04
【问题描述】:

我有这段代码,我希望我的 FragmentStatePageAdapter(在 viewpager 内)的第一个片段根据一些布尔值进行更改。

inner class MainFragmentAdapter(fragmentManager: FragmentManager) :
        FragmentStatePagerAdapter(fragmentManager) {

    override fun getCount(): Int {
        return MainView.Fragments.values().size
    }

    override fun getItem(position: Int): Fragment? {
        return when (position) {
            0 -> {
                if (booleanOne && !booleanTwo) {
                    FragmentOne.newInstance()
                } else if (booleanTwo && !booleanOne) {
                    FragmentTwo.newInstance()
                } else {
                    FragmentThree.newInstance()
                }
            }
            else -> null
        }
    }
}

到目前为止,我找到的唯一解决方案是,当我个人知道其中一个布尔值发生了变化时,我只是做了类似的事情:

   _fragmentAdapter = MainFragmentAdapter(getLifecycleFragmentManager())

   fragmentViewPager.adapter = _fragmentAdapter

所以我只是再次设置了适配器,但这样做对我来说似乎很不合适。我不能强迫它再次计算 getItem 吗?

【问题讨论】:

  • 也许添加一个addOnPageChangeListener 并在那里传递一些东西?

标签: android kotlin fragment fragmentpageradapter


【解决方案1】:

在你的类中进行这些更改,notifyDataSetChanged(),然后覆盖将在每次通知时调用的getItemPosition(),然后返回相应的常量,POSITION_NONE,如果你想看到新的更改,否则POSITION_UNCHANGED

    inner class MainFragmentAdapter(fragmentManager: FragmentManager) :
        FragmentStatePagerAdapter(fragmentManager) {

    override fun getCount(): Int {
        return MainView.Fragments.values().size
    }

    override fun getItem(position: Int): Fragment? {
        return when (position) {
            0 -> {
                if (booleanOne && !booleanTwo) {
                    FragmentOne.newInstance()
                } else if (booleanTwo && !booleanOne) {
                    FragmentTwo.newInstance()
                } else {
                    FragmentThree.newInstance()
                }
               notifyDataSetChanged();
            }
            else -> null
        }
    }

    override fun getItemPosition(@NonNull `object`: Any): Int {
            // this method will be called for every fragment in the ViewPager
            return if (`object` is FragmentOne) {
                POSITION_UNCHANGED // don't force a reload
            } else {
                // POSITION_NONE means something like: this fragment is no longer valid
                // triggering the ViewPager to re-build the instance of this fragment.
                POSITION_NONE
            }
        }

}

【讨论】:

  • 该部分的notifiyDataSetChanged是不可能的,看到它然后尝试返回Unit。
  • getItemPosition 的底部,我不太清楚你的意思是什么?在这种情况下,默认片段是 FragmentThree。
  • 在 getItemPosition 中,它只是检查您是否需要根据某些条件引用适配器,所以在这里我检查片段是否是 FragmentOne,您可以在那里添加自己的逻辑。只要需要更改,就会在 Adapter 中调用 notifyDataSetChanged。就像用户单击某个按钮然后您想更改该片段然后简单地使用适配器对象只需调用 notifyDataSetChanged 并在 getItemPosition 中根据某些 if 条件返回提到的常量。
  • 太棒了,所以现在我做了一个简单的 shouldUiUpdate 布尔值,我之前重置适配器的部分,我只是将它设置为 true,然后在 getItemPosition 中,我将它设置为 POSITION_NONE 如果这是真的,然后再次将其设置为假。它似乎有效,谢谢老兄!
  • 您会将其标记为答案,以便对其他人也有帮助吗?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多