首页 > 解决方案 > 在将数据添加到 recyclerview 时添加(或重新输入)片段时,片段事务滞后

问题描述

recyclerviews当切换到显示数据的片段时,我的片段事务存在一些滞后相关问题。数据越多、越复杂,交易就越滞后。

我对滚动性能等没有任何问题。只有事务动画(在这种情况下是幻灯片)。

只有当我在片段生命周期recyclerview的某些方法中提供数据时,才会出现问题,例如,...onCreateViewonViewCreated

我唯一可以摆脱滞后的情况是,如果我等到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或类似调用时的滞后)

标签: androidandroid-fragmentskotlinandroid-recyclerview

解决方案


我认为现在回答为时已晚。在创建视图时,您不应该在 UI 线程上做大量工作。您可以在片段中覆盖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;
}

推荐阅读