简体   繁体   English

如何更改FragmentStatePagerAdapter的getItem中的片段

[英]How to change fragment inside getItem of FragmentStatePagerAdapter

I have this code, where I want the first fragment of my FragmentStatePageAdapter(inside a viewpager), to change, depending on some boolean values. 我有这段代码,我想根据某些布尔值更改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
        }
    }
}

As of now, the only solution I found, was when I personally knew one of the boolean values changed, I just did something similar to this : 到目前为止,我发现的唯一解决方案是,当我个人知道其中一个布尔值已更改时,我只是做了类似的事情:

   _fragmentAdapter = MainFragmentAdapter(getLifecycleFragmentManager())

   fragmentViewPager.adapter = _fragmentAdapter

So I just set the adapter once again, but it seems rather off to me to do this. 因此,我只是再次设置了适配器,但是这样做似乎不可行。 Can't I force it to just calculate getItem once again? 我不能强迫它再次计算getItem吗?

Inside your class make these changes, notifyDataSetChanged() and then override the getItemPosition() which will be called on every notify and then just return the respective constant, POSITION_NONE if you want to see new changes or else POSITION_UNCHANGED 在您的类中进行这些更改, 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
            }
        }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM