我的activity
中有一个fragment A
。当我想要替换该fragment
时,我可以将fragment A
移出屏幕并将fragment B
移动到屏幕上。
但是,在显示 fragment B
之前,存在轻微的滞后/延迟。我已将问题范围缩小为我的 Recycler Adapter
加载 5 个或更多项目,导致 0.5 秒
延迟(当 Recycler 没有项目时没有延迟)。它也只发生在第一次加载项目时。
我认为这是因为适配器加载在 ui 线程
上花费了大约 0.5 秒
。
我的问题是,如何设计才能不再出现延迟?
我的Adapter
在fragment的
onViewCreated()
内部被调用,但这似乎并没有消除延迟。
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
viewModel = new ViewModelProvider(this).get(MainViewModel.class);
adapter = new BackpackAdapter(viewModel.getListItems());
recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
recyclerView.setAdapter(backpackAdapter);
}
我还使用 Glide 在后台线程上加载图像,但它似乎也没有消除延迟。
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int i) {
Glide.with(holder.itemView.getContext())
.load(list.get(i).getImage())
.apply(RequestOptions.centerCropTransform())
.into(holder.imageView);
...
...
这是我的 fragment 转换
,用于将 fragment A
移出屏幕以显示B
getChildFragmentManager().beginTransaction()
.setReorderingAllowed(true)
.setCustomAnimations(R.anim.enter_right, R.anim.exit_left, R.anim.enter_left, R.anim.exit_right)
.replace(R.id.container_view, new FragmentB(), "FRAG_B")
.commit();
有人知道我可以做些什么来使 fragment 过渡更加平滑吗?
最佳答案
我也遇到了这个问题,我使用 Fragment 的 postponeEnterTransition
方法解决了这个问题。
首先,您需要从基本 fragment 扩展所有 fragment ,如下所示:
public class HomeFragment extends BaseFragment {
}
接下来创建 BaseFragment 类,如下所示:
public class BaseFragment extends Fragment {
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// we don't need to change transition animations when method calls again!
if (savedInstanceState != null) return;
// here we pause enter transition animation to load view completely
postponeEnterTransition();
// we set the background color of root view to white
// because navigation animations run on a transparent background by default
view.setBackgroundColor(Color.WHITE);
// here we start transition using a handler
// to make sure transition animation won't be lagged
view.post(() -> postponeEnterTransition(0, TimeUnit.MILLISECONDS));
}
}
仅供引用,我使用了导航组件,并为所有 fragment 应用过渡动画,我在样式中添加了这些行:
<style name="Theme.AppName" parent="Theme.MaterialComponents.Light.NoActionBar">
<item name="enterAnim">@anim/enter_anim</item>
<item name="exitAnim">@anim/exit_anim</item>
<item name="popEnterAnim">@anim/pop_enter_anim</item>
<item name="popExitAnim">@anim/pop_exit_anim</item>
</style>
注意:如果您使用 LiveData
来更新 recyclerView,则会导致过渡动画出现滞后,因为它会异步加载项目。
希望这有帮助!
关于android - 当用另一个 fragment 替换 fragment 时, fragment 转换有轻微的延迟,如何防止它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74838068/