В пейджере представления есть элементы [] в адаптере (получено из FragmentStatePagerAdapter
), и они будут добавлены с помощью пролистывания до конца. Данные самого предмета динамически изменяются.
При перелистывании страницы, если данные элемента не готовы к отображению в это время, пейджер должен пропустить ее и показать следующий.
т.е. У элемента [] есть [a, b, c, d, e ...], когда он показывает c
и проведите пальцем, чтобы показать его левую сторону, b
, который должен отображаться. Но если в это время данные b
не готовы к показу, они должны показать a
. И если проведите пальцем назад от a
и данные b
готовы к отображению сейчас, то должно отобразиться b
.
предлагается здесь сделать viewPager.setCurrentItem(newPosition)
в
override fun onPageSelected(position: Int)
функция, * * тысяча двадцать один
но сначала он показывает b
и быстро меняется на a
, это не очень хороший опыт.
И еще один здесь предложил выполнить проверку и вернуть соответствующий фрагмент в:
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
при перелистывании)
Тем не менее, я не думаю, что это правильно, чтобы изменить там для данной позиции и вернуть другой фрагмент.
также посмотрел на это , попробовал:
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()
для вызова.
Как пропустить страницу на основе ее динамических данных?