ViewPager con múltiples instancias de fragmentos de la misma clase

Estoy tratando de crear un ViewPager que contiene 5 fragmentos. 5 fragmentos "contenedor", por lo que cada uno de ellos contienen 2 fragmentos. Los 4 primeros fragmentos tienen el mismo diseño y pertenecen a la misma clase. El quinto es de otra clase, y no hay problema con eso.

El problema es que cuando se lanza la actividad, solo 1 fragmento parece estar funcionando (el que está en la posición 0 en viewPager). Intenté devolver el nuevo fragmento () en la posición 0 en mi PagerAdapter, pero cuando hago eso es el 2do fragmento que está trabajando. (Trabajando me refiero a mostrar la lista de la izquierda, todavía no he cuidado del fragmento de detalles a la derecha)

Aquí hay algún código

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 

Aquí están las constantes que uso:

 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; // ... } 

Y el xml para el contenedor:

 <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> 

Así que este código no está funcionando, parece que la lista de la izquierda en el contenedor de fragmentos se reemplaza en cada fragmento, y sólo el fragmento en la posición 0 lo muestra. (Actualmente muestra la lista con el adaptador del tipo "JOURNAL", pero debe mostrar la lista del tipo "AGENDA".

——————– * PERO! … * ——————–

Si creo diferentes archivos de diseño fragment_container y escribo condiciones IF en el onCreateView y onViewCreated en ContainerFragment.java, todo funciona bien. Asi que :

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(); 

Supongo que es porque en cada fragmento, reemplazo el LinearLayout del mismo ID? (Replaceable_list) Pensé que era posible compartir el mismo archivo de diseño para cada fragmento y no quería crear 4 archivos de diseño que serían los mismos. Pero parece que debo hacerlo? ¿O me falta algo aquí?

Gracias por tu tiempo,

2 Solutions collect form web for “ViewPager con múltiples instancias de fragmentos de la misma clase”

Aunque una respuesta muy tarde, pero yo estaba enfrentando el mismo tipo de problema y arreglé el problema mediante el uso

 getChildFragmentManager().beginTransaction() 

en lugar de

 getActivity().getSupportFragmentManager().beginTransaction() 

Como en este caso estamos tratando de hacer la transacción desde dentro de un fragmento (uno de la lista de fragmentos que se adjuntan a ViewPager, por lo tanto la actividad que sostiene ViewPager) por lo que tenemos que utilizar getChildFragmentManager () aquí para obtener los resultados deseados.

Pude resolver esto poniendo el id de la disposición que se infla dentro de cada fragmento a su posición.

Lo que tendrías que hacer es simplemente cambiar el método onCreateView en tu clase ContainerFragment a:

 @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; 

Esto funciona debido a la forma en que la implementación FragmentPagerAdapter maneja las etiquetas de fragmento.

  • Implemente arrastrar elemento a la función de borde de pantalla
  • ViewPager PagerObserver no estaba registrado
  • Androide viewpager fuera de la memoria
  • IllegalArgumentException: No se encontró ninguna vista para id para fragmento - ViewPager en ViewPager
  • Android ViewPager y TabLayout no funcionan rápido
  • Fragmento de elementos compartidos no funcionan con ViewPager
  • Pestañas con los iconos que utilizan ViewPager, ¿cómo ponerlos? Adjuntando un archivo de diseño
  • ViewPager dentro de ViewPager
  • Cómo resolver para viewpager: El niño especificado ya tiene un padre. Debe llamar a removeView () en el padre del niño primero
  • Acceda a la vista de fragmentos de padres de ViewPager en el fragmento secundario de Pager
  • Cómo hacer la transición de viewpager rápido con fragmento?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.