FragmentPagerAdapter在数据更改后显示错误的片段

时间:2018-02-16 14:59:51

标签: android fragmentstatepageradapter

我有一个简单的FragmentPagerAdaper,我已经覆盖了getItemgetCount方法。

在更改数据之前,一切正常。

即使在致电notifyDataSetChanged后,ViewPager也会显示旧片段,即使很难,我也不会将其归还getItem

Kotlin代码:

private inner class Adapter(fragmentManager: FragmentManager) : FragmentPagerAdapter(fragmentManager) {
    override fun getItem(position: Int): Fragment {
        when (getType(position)) {
            Constants.CHAT_TYPE_PARTNER -> {
                return TaskChatFragment.newInstance(...)
            }
            Constants.CHAT_TYPE_SUPPORT -> {
                return TaskChatFragment.newInstance(...)
            }
        }
        throw IllegalArgumentException("invalid position " + position)
    }

    fun getPosition(type: Int) =
            if (type == Constants.CHAT_TYPE_SUPPORT && shouldShowPartnerChat()) 1 else 0

    override fun getCount(): Int {
        var count = 0
        if (shouldShowPartnerChat()) count++
        if (shouldShowSupportChat()) count++
        return count
    }
}

1 个答案:

答案 0 :(得分:0)

除了2种方法之外,我还需要覆盖getItemId,因为我正在更改getItem返回的片段的位置。如文档中所述:

  

long getItemId (int position)

     

在给定位置返回项目的唯一标识符。

     

默认实现返回给定的位置。 如果项目的位置可以更改,则子类应覆盖此方法。

    /**
     * We need to override this as positions of items may change.
     *
     * Like when the partner conv is hidden.
     */
    override fun getItemId(position: Int) = getType(position).toLong()

我在使用断点进行调试后发现了这一点,并意识到在调用getItem之后没有调用notifyDataSetChanged