当切换到显示数据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
或类似调用时,这会导致滞后(
我认为回答已经很晚了。 在创建视图时,您不应该在 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;
}