Почему notifyDataSetChanged взрывает PagerTransformer во ViewPager2?

Я использую ViewPager2 версии 1.0.0-beta05 с RecyclerView.Adapter, и ZoomOutPageTransformer, я обнаружил, что когда мы вызываем notifyDataSetChanged, представление ViewPager взрывается вверх.

В версии 1.0.0-alpha01 сказано, что notifyDataSetChanged полностью функциональна (исправлены ошибки VP1)

развернутый вид

Нормальное поведение

        pagerAdapter?.clickListener = this
        with(pager) {
            clipToPadding = false
            clipChildren = false
            offscreenPageLimit = 3
        }
        pager.adapter = pagerAdapter
        pager.setPageTransformer(ZoomOutPageTransformer())


        GlobalScope.launch(Dispatchers.Main) {
            // launch a new coroutine in background and continue
            repeat(15) {
                delay(5000L) // non-blocking delay for 1 second (default time unit is ms)
                Log.e("hello", "notify")
                pagerAdapter?.notifyDataSetChanged()
            }
        }

Я не менял источник данных, я просто провел этот небольшой тест, и проблема все еще сохраняется, размер представления менялся некрасиво случайным образом после каждого вызова notifyDataSetChanged.


person Community    schedule 15.10.2019    source источник
comment
Поделитесь кодом своего класса ZoomOutPageTransformer, а пока проверьте этот stackoverflow.com/a/58056129/7666442   -  person AskNilesh    schedule 16.10.2019
comment
Я использовал тот же класс в документе developer.android.com/ обучение / анимация / Проблема в том, что при вызове notifyDataSetChanged представления размещаются повсюду   -  person    schedule 16.10.2019
comment
Вы проверили это решение stackoverflow.com/a/58056129/7666442   -  person AskNilesh    schedule 16.10.2019
comment
Я протестировал это решение, появляется та же проблема   -  person    schedule 16.10.2019


Ответы (2)


ты нашел какое-нибудь решение?

Для меня я должен вызвать функцию ViewPager2 requestTransform(). Но мне нужно post вызов функции после adatper.notifyDataSetChanged().

...
adapter.notifyDataSetChanged()
vb.viewpager.post {
    // I am using Fragment, and I get some crashes while I am switching tabs/fragments,
    // so here I reference the `nullable` _vb property
    _vb?.viewpager?.requestTransformation()
}

Надеюсь это поможет.

person Z.J Hung    schedule 15.05.2020

Вам следует прочитать api doc:

 /**
 * Sets a {@link PageTransformer} that will be called for each attached page whenever the
 * scroll position is changed. This allows the application to apply custom property
 * transformations to each page, overriding the default sliding behavior.
 * <p>
 * Note: setting a {@link PageTransformer} disables data-set change animations to prevent
 * conflicts between the two animation systems. Setting a {@code null} transformer will restore
 * data-set change animations.
 * ...
 */
public void setPageTransformer(@Nullable PageTransformer transformer) {}

Чтобы исправить это, попробуйте сбросить Page Transformer:

pager.setPageTransformer(null)
adapter.notifyDataSetChanged()
pager.setPageTransformer(myPageTransformer)
person Александр Кундрюков    schedule 30.11.2020