视图分页器的适配器中有items [](源自FragmentStatePagerAdapter
),并且通过滑动将其附加到末尾。商品的数据本身正在动态变化。
在页面上滑动时,如果当时尚不能显示其项目数据,则寻呼机应跳过它并显示下一个。
即item []具有[a,b,c,d,e ...],当它显示c
并滑动以显示其左侧时,应该显示b
。但是,如果此时b
数据尚未准备好显示,则应该显示a
。而且,如果从a
向后滑动,并且b
的数据现在可以显示了,那么它应该显示b
。
建议here在
中执行viewPager.setCurrentItem(newPosition)
override fun onPageSelected(position: Int)
功能
但是它首先显示b
,然后迅速更改为显示a
,这不是很好的体验。
另外一个here建议进行检查并在以下位置返回正确的片段:
override fun getItem(position: Int): Fragment {
}
无法在getItem(position: Int)
中执行此操作,因为它调用得太早,即,当c
显示b
已创建用于通过getItem(1)
在寻呼机中进行缓存时,但是c
可能会显示很长时间,并且b
的数据可能已从“可以显示”更改为“无法显示”。
(但是在显示c
并跳过不可用的项目以便在寻呼机中进行缓存时,这是可以接受的,因此在这种情况下,可以在getItem(position: Int)
中进行缓存。问题仅在于那些滑入寻呼机时,将其从able to show
更改为NOT able to show
时的数据)
仍然认为更改给定位置的位置并返回不同的片段是不合适的。
还看着this,尝试过:
override fun getItem(position: Int): Fragment {
var item = dataList[position]
var fragment: Fragment? = null
when (item) {
is DataItem -> {
Log.e("+++", "+++ getItem($position), (item is DataItem), call notifyDataSetChanged()")
notifyDataSetChanged()
fragment = Data2Fragment(item)
}
else -> fragment = ……
}
return fragment
}
override fun getItemPosition(fragment: Any): Int {
Log.e("+++", "+++ enter getItemPosition($fragment)")
(fragment as? Data2Fragment)?.let {
if (!fragment.data.isAvailable) {
return POSITION_NONE
.also {
Log.e("+++", "+++ --- exit ======================== pagerDatapter:getItemPosition($fragment), return position: POSITION_NONE")
}
}
}
return super.getItemPosition(fragment) //POSITION_UNCHANGED
.also {
Log.e("+++", "+++ --- exit pagerDatapter:getItemPosition($fragment), return position: $it")
}
}
它会导致无限循环:
+++ getItem(1), (item is DataItem), call notifyDataSetChanged()
+++ enter getItemPosition(DataFragment{58372fe #0 id=0x7f0a00f2})
--- exit pagerDatapter:getItemPosition(DataFragment{58372fe #0 id=0x7f0a00f2}), return position: -1
+++ enter getItemPosition(DataFragment{1e4f8dc #2 id=0x7f0a00f2})
+++ --- exit pagerDatapter:getItemPosition(DataFragment{1e4f8dc #2 id=0x7f0a00f2}), return position: -1
+++ getItem(1), (item is DataItem), call notifyDataSetChanged()
+++ enter getItemPosition(DataFragment{58372fe #0 id=0x7f0a00f2})
+++ --- exit pagerDatapter:getItemPosition(DataFragment{58372fe #0 id=0x7f0a00f2}), return position: -1
+++ enter getItemPosition(DataFragment{1e4f8dc #2 id=0x7f0a00f2})
+++ --- exit pagerDatapter:getItemPosition(DataFragment{1e4f8dc #2 id=0x7f0a00f2}), return position: -1
+++ getItem(1), (item is DataItem), call notifyDataSetChanged()
…
…
…
它不起作用(可能不了解呼叫顺序,或者notifyDataSetChanged()
何时导致getItemPosition()
被呼叫。
如何基于动态数据跳过页面?