FragmentStatePagerAdapter仅收取页面当前

时间:2017-04-25 05:44:48

标签: android caching android-viewpager fragment fragmentstatepageradapter

使用FragmentStatePagerAdapter时“这对于通过对象集合进行分页更好是未定义的。在用户导航到其他页面时销毁片段,从而最大限度地减少内存使用” [

当您第一次加载0位置时,此FragmentStatePagerAdapter的工作方式如下,它的作用是加载 第1页和第1页如果转到第1页,则加载第3页,如果之后(在创建当前位置的基础之后)。 如果我转到实际位置的后退选项卡再没有加载数据,如果它缓存了视图,我的问题 在这种行为中,似乎真实视图的左视图和右视图都被缓存,有某种 省略这种行为

您在stackOverflow中找到的答案尚不清楚,找到一个Internet访问选项,其中提到修改此类 FragmentStatePagerAdapter继承了PageAdapter,我还没有解决这个问题5天,如果有人可以帮我解释一下如何解决它,我会非常高兴。 可以清除FragmentStatePagerAdapter缓存的自定义类 [

// getItem它不能按预期的方式工作(只是膨胀当前片段) 自定义类,可以清除FragmentStatePagerAdapter缓存

public class CostumAdapter extends FragmentStatePagerAdapter {

        public CostumAdapter(FragmentManager fm) {
            super(fm);

        }

        @Override
        public Fragment getItem(int position) {
            System.out.println("POSICION: "+position);
            Bundle bundle = new Bundle();
            FragmentBebidas fragmentBebidas = new FragmentBebidas();
            bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
            fragmentBebidas.setArguments(bundle);

            return fragmentBebidas;

        }

        @Override
        public CharSequence getPageTitle(int position) {
            return menuTabs.get(position).toString();
        }

        @Override
        public int getCount() {
            return menuTabs.size();
        }

        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            super.destroyItem(container, position, object);

        }
    }

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:0)

可以解决此问题,您可以使用FragmentManager来保留ViewPager创建的片段。

扩展此abstract

public abstract class StateSaveFragmentAdapter extends FragmentPagerAdapter {

    public FragmentManager fragmentManager;

    public StateSaveFragmentAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
        this.fragmentManager = fragmentManager;
    }

    public abstract int viewPagerId();

    public Fragment getSavedFragment(int position) {
        return fragmentManager.findFragmentByTag(frameworkFragmentName(viewPagerId(),
                getItemId(position)));
    }

    private String frameworkFragmentName(int viewId, long id) {
        return "android:switcher:" + viewId + ":" + id;
    }
}

您的适配器应如下所示:

public class CustomAdapter extends StateSaveFragmentAdapter {

    public ProjectDetailFragmentAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
    }

    @Override
    public int viewPagerId() {
    // your viewpager id
        return R.id.pager;
    }

    @Override
    public Fragment getItem(int position) {
    // check if fragment was saved
        if (getSavedFragment(position) != null) 
        return getSavedFragment(position);

    // if save fragment was null, continue with normal implementation           
    FragmentBebidas fragmentBebidas = new FragmentBebidas();
        bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
        fragmentBebidas.setArguments(bundle);
    return fragmentBebidas;
    }

    @Override
    public int getCount() {
    // your implementation
    }

    @Override
    public CharSequence getPageTitle(int position) {
        // your implementation
    }
}

答案 1 :(得分:0)

@Isa M我想你需要刷新用户可见的特定片段的数据。为此,您可以使用方法setUserVisibleHint()。因为布尔变量可以让您知道片段是否对用户可见。 如果它是在该块中执行所需的代码。