具有相同类的多个片段实例的ViewPager

我正在尝试创build一个包含5个片段的ViewPager。 5个片段“容器”,所以他们每个都包含2个片段。 4个第一个片段具有相同的布局,属于同一个类别。 第五个来自另一个class级,这个没有问题。

问题是,当活动启动时,只有1个片段似乎正在工作(viewPager中位置0的一个)。 我尝试在我的PagerAdapter中的位置0处返回新的Fragment(),但是当我这样做的时候,它是正在工作的第二个片段。 (通过工作,我的意思是显示在左边的列表,我仍然没有照顾右边的细节片段)

这是一些代码

CustomPagerAdapter.java

public class CustomPagerAdapter extends FragmentPagerAdapter{ public CustomPagerAdapter(FragmentManager fm) { super(fm); } public CustomPagerAdapter(FragmentManager fm, Context context) { super(fm); } @Override public Fragment getItem(int pos) { if(pos == 4) return new OtherContainerFragment(); else return new ContainerFragment(pos); } @Override public int getCount() { return 5; } 

ContainerFragment.java

 public class ContainerFragment extends Fragment { private int CONTAINER_TYPE; public ContainerFragment(){ } public ContainerFragment(int type){ CONTAINER_TYPE = type; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_container, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); CustomListFragment frag = new CustomListFragment(CONTAINER_TYPE); ft.replace(R.id.replaceable_list, frag); ft.commit(); 

CustomListFragment.java

 public class CustomListFragment extends SuperCustomListFragment{ private ArrayList<Model> mModels; private int TYPE; public CustomListFragment(){ } public CustomListFragment(int type){ TYPE = type; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return super.onCreateView(inflater, container, savedInstanceState); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mModels = new ArrayList<Model>(); if(TYPE == AppConstants.FRAGMENT_TYPE_JOURNAL){ mAdapter = AppUtils.getJournalListAdapter(getActivity(), mModels); new syncPapers().execute(); }else if(TYPE == AppConstants.FRAGMENT_TYPE_MOVIES){ mAdapter = AppUtils.getMoviesListAdapter(getActivity(), mModels); new syncMovies().execute(); } if(mAdapter != null) mListView.setAdapter(mAdapter); //mListView is defined in the superClass 

这里是我使用的常量:

 public class AppConstants { public static final int FRAGMENT_TYPE_AGENDA = 0; //so Fragment at position 0 should be of type agenda public static final int FRAGMENT_TYPE_NEWS = 1; // position 1 should be of type news public static final int FRAGMENT_TYPE_MOVIES = 2; // ... public static final int FRAGMENT_TYPE_JOURNAL = 3; // ... } 

和容器的XML:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <LinearLayout android:id="@+id/replaceable_list" android:layout_width="match_parent" android:layout_height="match_parent" > </LinearLayout> <LinearLayout android:id="@+id/replaceable_details" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/background" > </LinearLayout> </LinearLayout> 

所以这个代码不工作,似乎在片段容器的左边的列表被replace在每个片段中,只有位置0的片段显示它。 (当前它显示的types为“JOURNAL”的适配器的列表,但它应该显示“AGENDA”types的列表。

——————– * 但是!… * ——————–

如果我创build不同的fragment_container布局文件,并在onCreateView和onViewCreated在ContainerFragment.java编写IF条件,一切工作正常。 所以:

ContainerFragment.java

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_JOURNAL) return inflater.inflate(R.layout.fragment_container_journal, container, false); else if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_MOVIES) return inflater.inflater(R.layout.fragment_container_movies, container, false); else return super.onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); CustomListFragment frag = new CustomListFragment(CONTAINER_TYPE); if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_JOURNAL) ft.replace(R.id.replaceable_journal_list, frag); else if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_MOVIES) ft.replace(R.id.replaceable_movies_list, frag); else return; ft.commit(); 

我想这是因为在每个片段中,我replace了相同ID的LinearLayout? (replaceable_list)我以为有可能共享每个片段相同的布局文件,并不想创build4个相同的布局文件。 但看起来我必须这样做? 还是我在这里错过了什么?

感谢您的时间,

Solutions Collecting From Web of "具有相同类的多个片段实例的ViewPager"

尽pipe答复很迟,但是我面临着同样的问题,我通过使用来解决这个问题

 getChildFragmentManager().beginTransaction() 

代替

 getActivity().getSupportFragmentManager().beginTransaction() 

就像在这种情况下,我们试图从一个片段(连接到ViewPager的片段列表中的一个,因此持有ViewPager的Activity)中进行事务,所以我们必须在这里使用getChildFragmentManager()来获得所需的结果。

我能够解决这个问题,通过设置在每个片段膨胀的布局的ID到它的位置。

你需要做的只是改变你的ContainerFragment类的方法onCreateView到:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_container, container, false); v.setId(CONTAINER_TYPE) return v; 

这是因为FragmentPagerAdapter实现处理片段标签的方式。