android - 在将数据添加到 recyclerview 时添加(或重新输入)片段时,片段事务滞后
问题描述
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;
}
推荐阅读
- python - 如何检查一个字典的值是否与 Python 中另一字典的值部分匹配?
- laravel - 清除缓存后在 null 上调用成员函数 connection()
- r - 将投影转换为地理坐标 R
- bash - 期望的自动密码输入不适用于将远程机器安装到我的本地文件夹
- reactjs - 当我们已经在调用 Modal 的 Button 中使用切换时,为什么我们必须在 Modal 和 ModalHeader 中使用切换?
- python - 在字典中切片列表的子集:如何将索引转换为整数?
- c# - 在 C# 中连接两个控制台应用程序
- css - 使所有行的高度与第一个 CSS 网格相同
- javascript - React Native Maps - 使用 Google Maps API 从 JSON 文件中显示标记
- json - .NET Core 中特定控制器的 Json 序列化设置