我正在使用 fragmentsViewPager2 显示 5 个 FragmentStateAdapter 。每个 fragment 都有 ExoPlayer 实例。我正在维护 ViewPager2.setOffscreenPageLimit(1) 并且它可以很好地加载 fragments 。但是,当我将 ViewPager2 向下滚动到 pos4 时, pos2pos1 应该调用 onStop()onDestroyView()onDestroy() 。但这并没有发生。

除非我按 onBackPress() ,否则这些方法都不会执行。 FragmentStateAdapter 的实现部分有什么我遗漏的吗?

我想对 exoPlayer.release() 执行 onDestroyView() 以释放应用程序的内存。

这里是代码

Activity

List<Post> postsList = response.getPosts();
ViewPagerAdapter adapter = new ViewPagerAdapter(this, postsList);
binding.pager.setOrientation(ViewPager2.ORIENTATION_VERTICAL);
binding.pager.setOffscreenPageLimit(1);
binding.pager.setAdapter(adapter);

ViewPagerAdapter
public class ViewPagerAdapter extends FragmentStateAdapter {

    private List<Post> postList;

    public ViewPagerAdapter(@NonNull FragmentActivity fragmentActivity, List<Post> postList) {
        super(fragmentActivity);
        this.postList = postList;
    }


    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return new PostFragment(postList.get(position), position);
    }

    @Override
    public int getItemCount() {
        if (postList == null) return 0;
        return postList.size();
    }

}

更新了

This is also a similar question

最佳答案

我已经提到了这个 POST 的解决方案。
VeiwPager2 建立在 RecyclerView 组件上,FragmentStateAdapter 替换 FragmentStatePagerAdapter

假设 offscreenPageLimit = 1ViewPager2 将有 3 fragments 2 fragmentsRecylerView Preloading Strategies 预加载/缓存所以,总共会有 5 加载。

为了禁用预加载和缓存,我执行了:

private void disableCacheOfViewPager() {

    try {

      // Disable Preloading
        ((RecyclerView) binding.pager.getChildAt(0)).getLayoutManager().setItemPrefetchEnabled(false);
        // Disable Cache
        ((RecyclerView) binding.pager.getChildAt(0)).setItemViewCacheSize(0);

    } catch (NullPointerException e) {

        Log.i(TAG, "disableCacheOfViewPager: " + e.getMessage());
    }
}


//1st
onStart: 0
onResume: 0
onStart: 1

//2nd
onStart: 2
onPause: 0
onResume: 1

//3rd
onStart: 3
onPause: 1
onResume: 2

//4th
onStart: 4
onPause: 2
onResume: 3

//5th
onStart: 5
onStop: 0
onDestroyView: 0
onDestroy: 0
onDetach: 0
onPause: 3
onResume: 4


//1st
onStart: 0
onResume: 0
onStart: 1

//2nd
onStart: 2
onPause: 0
onResume: 1

//3rd
onStart: 3
onStop: 0
onDestroyView: 0
onDestroy: 0
onDetach: 0
onPause: 1
onResume: 2

关于android - 使用 ViewPager2 和 FragmentStateAdapter 的 fragment 生命周期行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60451423/

10-09 12:36