Java FragmentPagerAdapter在第一页显示所有片段内容

Java FragmentPagerAdapter在第一页显示所有片段内容,java,android,android-fragments,android-viewpager,fragmentpageradapter,Java,Android,Android Fragments,Android Viewpager,Fragmentpageradapter,在内存中,我有一个项目列表,每个项目都有一个标题和一个0..N个块(存储一些信息)的列表。我知道我在内存中正确地创建了这个列表,因为我已经将整个结构输出到命令行 我有一个使用ViewPager显示此数据的活动。ViewPager的每一页都是一个项目,其中填充了包含项目每个区块信息的片段 按照我目前的编码方式,前两个项目的块显示在第一个项目下的第一页上。当页面滚动到第二页时,它是空的。当页面滚动到第3页时(我现在只有3个测试项目的列表),它也会显示一个空白页面,但是,当页面返回到第2页时,它会显示

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

我有一个使用ViewPager显示此数据的活动。ViewPager的每一页都是一个项目,其中填充了包含项目每个区块信息的片段

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

以下是我的主要活动(包括FragmentPagerAdapter):

控制器非常简单,返回的信息与您期望的一样。Controller.setup()只创建项目列表

这是我的物品片段:

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;
    }
}
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中的片段中实例化片段的困难有关

你可以考虑取消这个作为一个可能性:这基本上归结为在你想要添加一个片段的片段中使用<代码> GeHealStReMistMaungMeor(< /代码>)。


也可以考虑扩展<代码> FractStasePigaServer < /代码>,这更好地保持了它们的破坏和恢复之间的碎片状态。

因此,我应该直接从PigelAdvor创建子片段吗?没关系,我现在明白正在发生的事情。是的,事实证明你是完全正确的。非常感谢。我也对你的问题感到困惑,然后突然想起遇到过类似的问题。我很高兴能帮上忙!MyFragment.onCreate()不处理旁注,应该检查savedInstance是否为null。只需在第一次创建片段时添加内容。这就是为什么我得到了复制品。
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;
    }
}