java - FragmentPagerAdapter 在第一页显示所有 fragment 内容

标签 java android android-fragments android-viewpager fragmentpageradapter

在内存中,我有一个项目列表,每个项目都有一个标题和一个 0..N block 列表(其中存储了一些信息)。我知道我在内存中正确地创建了这个列表,因为我已经将整个结构输出到命令行。

我有一个使用 ViewPager 来显示此数据的 Activity 。 ViewPager 的每个页面都是一个 Item,它充满了 Fragments,这些 Fragments 包含有关 Item 每个 block 的信息。

按照我目前的编码方式,前两个项目的 block 显示在第一个项目下的第一页上。当页面滚动到第二页时,它是空的。当页面滚动到第 3 页时(我现在只有 3 个项目的列表用于测试)它也显示一个空白页面,但是,当页面返回到第 2 页时,它显示第一个项目的 block .然后,每次导航到第 1 页然后第 2 页时,第 3 页的 block 都会新添加到现有列表中。如果有从第 2 页到第 3 页再返回的导航,第 1 项的 block 将新添加到列表中。这可以通过不断增长的列表来令人作呕。我不知道为什么它的行为不正常。

这是我的主要 Activity (包括 FragmentPagerAdapter):

public class MyActivity extends FragmentActivity {
    MyPagerAdapter mPagerAdapter;
    ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Controller.setup();

        mPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());

        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mPagerAdapter);
    }

    public class MyPagerAdapter extends FragmentPagerAdapter {
        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            Fragment fragment = new MyFragment();

            Bundle args = new Bundle();
            args.putInt(MyFragment.POSITION, position);
            fragment.setArguments(args);

            return fragment;
        }

        @Override
        public int getCount(){
            return Controller.getAmount();
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return Controller.getItem(position).getTitle();
        }
    }
}

Controller 非常简单,返回的信息正如您所期望的那样。 Controller.setup() 只是创建项目列表。

这是我的项目 fragment :

public class MyFragment extends Fragment {
    public final static String POSITION = "position";
    private int pos;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        pos = getArguments().getInt(POSITION);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_item, container, false);

        Item item = Controller.getItem(pos);
        Iterator<Chunk> chunks = item.getChunks().iterator();
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();

        while(chunks.hasNext()){
            Chunk chunk = chunks.next();
            ChunkFragment entry = new ChunkFragment();

            Bundle args = new Bundle();         
            args.putString(ChunkFragment.INFO_ARG, chunk.getInfo());
            entry.setArguments(args);

            transaction.add(R.id.container, entry);
        }
        transaction.commit();

        return rootView;
    }
}

最后是我的 Chunk fragment :

public class ChunkFragment extends Fragment {
    public static final String INFO_ARG = "Info";
    private String mInfo;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        Bundle args = getArguments();
        mInfo = args.getString(INFO_ARG);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //setup view
        ViewGroup rootView;

        rootView = (ViewGroup) inflater.inflate(R.layout.fragment_chunk, container, false);

        TextView infoView = (TextView) rootView.findViewById(R.id.info_text);
        infoView.setText(mInfo);

        return rootView;
    }
}

我知道这是很多代码,但我不知道问题出在哪里。我已将其简化到最低限度,仅包括可能成为问题根源的操作。我也没有包括我的 XML 布局文件,但它们已经过测试并且工作正常。

最佳答案

我不确定这一点,但我相信您的问题可能与在 ViewPager 的 Fragments 中实例化 Fragments 的困难有关。

您可以考虑将其取消资格作为一种可能性 by following the guidelines for nesting fragments :这基本上归结为在要添加 fragment 的 fragment 上使用 getChildFragmentManager()

此外,您可能需要考虑扩展 FragmentStatePagerAdapter,它可以更好地维护 fragment 在销毁和重建之间的状态。

关于java - FragmentPagerAdapter 在第一页显示所有 fragment 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15795655/

相关文章:

java - 无法在共享首选项中保存 "long"

android - 如何以编程方式更新 Android 应用程序

java - 从其他 fragment 中的按钮打开新 fragment

java - 尝试使用 JFrame 和 JPanel 将窗口绘制为黑色

java - 如何通过 Google Cloud Datastore JSON API 存储带有子类的类?

java - 使用构造函数注入(inject)正确设计为可测试性而构建的类

android - 错误 :com. android.builder.dexing.DexArchiveBuilderException : Failed to process guava-21. 0.jar Android 3.1 Dev Channel

android - Recyclerview item点击波纹效果

java - Android - 为什么使用接口(interface)被认为是 Activity 和 Fragment 之间通信的最佳实践?

java - 3.13 版中缺少 Apache POI hslf?