我在 IssueTracker中为此创建了一个错误报告。不过,对我来说,甚至notifyItemChanged(position:)
andnotifyItemRangeChanged(positionStart:itemCount:)
方法的行为也不正确。
该错误是由于该FragmentStateAdapter.getItemId(position:)
方法的默认实现仅返回position
传递给它的方法。因此,itemId
for each在调用position
之前和之后将是相同的,因此不会重新创建任何 s。FragmentStateAdapter.notifyDataSetChanged()
Fragment
一种可能的解决方法是在您的实现中为每个页面分配一个唯一的 id,并在调用该方法FragmentStateAdapter
时为每个页面分配一个新的 id 。notifyDataSetChanged()
请参阅下面类中的init
块,该块ViewPagerAdapter
有助于解决此问题:AdapterDataObserver
在此块中注册一个对象,以便init
在调用时接收回调notifyDataSetChanged()
。
class ViewPagerAdapter(fragmentActivity: FragmentActivity) :
FragmentStateAdapter(fragmentActivity) {
private var counter = 0L
private var itemIds: List<Long>
init {
itemIds = generateListOfItemIds()
val adapterDataObserver = object : AdapterDataObserver() {
override fun onChanged() {
itemIds = generateListOfItemIds()
}
}
registerAdapterDataObserver(adapterDataObserver)
}
override fun createFragment(position: Int): Fragment {
return PageFragment.newInstance(position)
}
override fun getItemCount(): Int {
return itemIds.size
}
override fun getItemId(position: Int): Long {
return itemIds[position]
}
override fun containsItem(itemId: Long): Boolean {
return itemIds.contains(itemId)
}
private fun generateListOfItemIds() = (1..5).map { counter++ }
}