我正在使用 fragments
和 ViewPager2
显示 5 个 FragmentStateAdapter
。每个 fragment
都有 ExoPlayer
实例。我正在维护 ViewPager2.setOffscreenPageLimit(1)
并且它可以很好地加载 fragments
。但是,当我将 ViewPager2
向下滚动到 pos4
时, pos2
和 pos1
应该调用 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 = 1
, ViewPager2
将有 3 fragments
和 2 fragments
由 RecylerView 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/