gpt4 book ai didi

android - 当用另一个 fragment 替换 fragment 时, fragment 转换有轻微的延迟,如何防止它?

转载 作者:行者123 更新时间:2023-12-03 07:59:32 24 4
gpt4 key购买 nike

我的activity中有一个fragment A。当我想要替换该fragment时,我可以将fragment A移出屏幕并将fragment B移动到屏幕上。

但是,在显示 fragment B之前,存在轻微的滞后/延迟。我已将问题范围缩小为我的 Recycler Adapter 加载 5 个或更多项目,导致 0.5 秒 延迟(当 Recycler 没有项目时没有延迟)。它也只发生在第一次加载项目时。

我认为这是因为适配器加载在 ui 线程 上花费了大约 0.5 秒

我的问题是,如何设计才能不再出现延迟?

我的Adapterfragment的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com