Фрагмент транзакции запаздывает при добавлении (или повторном вводе) фрагмента при добавлении данных в представление переработчика - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть некоторые проблемы, связанные с лагами в моих транзакциях фрагментов, при переключении на фрагмент, который отображается как recyclerviews с данными.Чем больше данных и сложнее, тем больше задержка транзакции.

У меня нет проблем с производительностью прокрутки и т. Д. Только анимация транзакции (в данном случае слайд).

Проблема возникает только тогда, когда я даю данные recyclerview в некоторых методах жизненного цикла фрагмента , например onCreateView, onViewCreated ...

Единственный раз, когда я могу избавиться от задержки, это если я дождусь завершения fragment transaction (анимация завершена), а затем передам данные recyclerview.Тем не менее, я не думаю, что это выглядит очень хорошо, когда он анимирует пустой экран и затем добавляет данные в recyclerview.

Есть ли в любом случае, я могу дать данные recyclerview до транзакциианимация выполняется без задержки?

Транзакция действительно проста:

val fragmentTransaction:        FragmentTransaction?    = supportFragmentManager?.beginTransaction()

fragmentTransaction?.setCustomAnimations(animationTheme.screenRootEnter(), animationTheme.screenRootExit(), animationTheme.screenRootPopEnter(),animationTheme.screenRootPopExit())
fragmentTransaction?.add(R.id.container, fragment, tag)
fragmentTransaction?.addToBackStack(tag)
fragmentTransaction?.commit()

Интересная часть - это та часть, где я передаю данные recyclerview:

fun setData(items: ArrayList<ListItem>) {
    this.mItems     = items
    notifyItemRangeInserted(0, items.size)
}

(Как уже упоминалось, это вызывает задержку при вызове из onCreateView или аналогичного)

1 Ответ

0 голосов
/ 26 февраля 2019

Я думаю, что уже поздно для ответа.Вы не должны делать большую работу над потоком пользовательского интерфейса при создании View.Вы можете переопределить onCreateAnimator() в своем фрагменте и узнать, когда закончится анимация.Затем вы можете добавить свои данные в RecyclerView адаптер.Вы можете показать ProgressBar во время создания представления и скрыть после выполнения после загрузки данных.

@Override
public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
    if (nextAnim != 0x0) {
        Animator animator = AnimatorInflater.loadAnimator(getActivity(), nextAnim);
        animator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {}
            @Override
            public void onAnimationEnd(Animator animation) {
                // We just need know animation ending when fragment entered and no need to know when exited
                if (enter) {
                    // here add data to recyclerview adapter
                }
            }
            @Override
            public void onAnimationCancel(Animator animation) {}
            @Override
            public void onAnimationRepeat(Animator animation) {}
        });
        return animator;
    }
    return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...