Как пропустить страницу в пейджере представления на основе динамических данных элемента - PullRequest
0 голосов
/ 09 мая 2019

В пейджере представления есть элементы [] в адаптере (получено из 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() для вызова.

Как пропустить страницу на основе ее динамических данных?

...