如何让 ViewPager 在我滚动到下一页后立即销毁项目
How to make ViewPager destroy items right after I've scrolled to next page
如果我们在 View 寻呼机中有 4 个页面并从位置 0 滑动到 3
当我们到达位置 2 时,位置 0 的项目被销毁,当我们到达位置 4 时,位置 1 的项目被销毁。
我需要立即销毁它们,因为我希望在返回视图时重新创建视图,而目前不会发生这种情况。
public class ViewPagerTutorialAdapter extends FragmentStatePagerAdapter {
public ViewPagerTutorialAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Bundle args = new Bundle();
args.putInt("page", position);
TutorialPageFragment fragment = new TutorialPageFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public int getCount() {
return 4;
}
}
public class TutorialPageFragment extends android.support.v4.app.Fragment {
private ImageView ivTutorialPage;
private TransitionDrawable myTransitionDrawable;
private View rootView;
public TutorialPageFragment() {
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_tutorial_page, container, false);
return rootView;
}
@Override
public void onResume() {
super.onResume();
ivTutorialPage = (ImageView) rootView.findViewById(R.id.ivTutorialPage);
ivTutorialPage.setImageResource(R.drawable.fadein);
myTransitionDrawable = (TransitionDrawable) ivTutorialPage.getDrawable();
new Timer().schedule(new TimerTask() {
@Override
public void run() {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
myTransitionDrawable.startTransition(1000);
}
});
}
}, 1000);
}
}
尝试viewPager.setOffscreenPageLimit(1);
。这应该只保存所选页面附近的一页。无法根据 this.
一次只加载选定的项目
虽然这不是所问问题的确切答案,但更好的做法是在没有必要的情况下不重新创建视图,因为在更复杂的布局上这样做可能会很昂贵 + 导致卡顿/额外的延迟,从而使用户体验更差。
在这种情况下(运行当片段变得可见时播放动画)最好用代码覆盖片段中的 setUserVisibleHint
到 运行 动画,这将在用户访问屏幕时触发。主要优点当然是无需重新创建视图,并允许 Android 自然地执行其内部优化。
如果我们在 View 寻呼机中有 4 个页面并从位置 0 滑动到 3 当我们到达位置 2 时,位置 0 的项目被销毁,当我们到达位置 4 时,位置 1 的项目被销毁。
我需要立即销毁它们,因为我希望在返回视图时重新创建视图,而目前不会发生这种情况。
public class ViewPagerTutorialAdapter extends FragmentStatePagerAdapter {
public ViewPagerTutorialAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Bundle args = new Bundle();
args.putInt("page", position);
TutorialPageFragment fragment = new TutorialPageFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public int getCount() {
return 4;
}
}
public class TutorialPageFragment extends android.support.v4.app.Fragment {
private ImageView ivTutorialPage;
private TransitionDrawable myTransitionDrawable;
private View rootView;
public TutorialPageFragment() {
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_tutorial_page, container, false);
return rootView;
}
@Override
public void onResume() {
super.onResume();
ivTutorialPage = (ImageView) rootView.findViewById(R.id.ivTutorialPage);
ivTutorialPage.setImageResource(R.drawable.fadein);
myTransitionDrawable = (TransitionDrawable) ivTutorialPage.getDrawable();
new Timer().schedule(new TimerTask() {
@Override
public void run() {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
myTransitionDrawable.startTransition(1000);
}
});
}
}, 1000);
}
}
尝试viewPager.setOffscreenPageLimit(1);
。这应该只保存所选页面附近的一页。无法根据 this.
虽然这不是所问问题的确切答案,但更好的做法是在没有必要的情况下不重新创建视图,因为在更复杂的布局上这样做可能会很昂贵 + 导致卡顿/额外的延迟,从而使用户体验更差。
在这种情况下(运行当片段变得可见时播放动画)最好用代码覆盖片段中的 setUserVisibleHint
到 运行 动画,这将在用户访问屏幕时触发。主要优点当然是无需重新创建视图,并允许 Android 自然地执行其内部优化。