2

Je rencontre un problème avec la bibliothèque de support ViewPager. Ce ViewPager vit à l'intérieur d'un fragment et il est composé de 3 onglets: un qui montrera quelques informations, le second et le troisième affichent une liste d'éléments (ils sont donc tous les deux générés à partir du même fragment). Quand je défile du premier au second, tout fonctionne bien, mais si j'essaie de faire défiler le second vers le troisième, quelque chose arrive aux fragments et ils n'apparaissent plus, même le PagerTabStrip disparaît quand cela arrive. J'ai aussi essayé d'utiliser le même type de fragment pour les 3 onglets (celui qui a disparu avec la liste) et tout semble fonctionner correctement, donc je suis assez embêté à ce sujet. En outre, le seul journal sur la console liée à la question est celle-ci:Android ViewPager n'affiche pas ses fragments correctement

W/FragmentManager: moveToState: état Fragment pour StoreListFragment {3fb980e7 # 2 id = 0x7f0d0080 android: switcher: 2131558528: 2} pas mis à jour en ligne ; état attendu 3 trouvé 2

Voici le code pour mon parent Fragment:

public class StoreFragment extends Fragment { 

@Bind(R.id.pager) ViewPager mPager; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_store, container, false); 
    ButterKnife.bind(this, v); 
    setupViewPager(); 
    return v; 
} 

private void setupViewPager() { 
    String[] titles = {getString(R.string.store_information), 
      getString(R.string.store_offers), 
      getString(R.string.store_products) 
    }; 
    mPager.setAdapter(new StoresPagerAdapter(getChildFragmentManager(), titles)); 
} 
} 

Voici le code pour le PagerAdapter:

public class StoresPagerAdapter extends FragmentPagerAdapter { 

private String[] mPageTitles; 

public StoresPagerAdapter(FragmentManager fm, String[] titles) { 
    super(fm); 
    mPageTitles = titles; 
} 

@Override 
public Fragment getItem(int position) { 
    switch (position){ 
     case 0: 
      return StoreInfoFragment.newInstance(); 
      //return StoreListFragment.newInstance(position); 
     case 1: 
      return StoreListFragment.newInstance(position); 
     case 2: 
      return StoreListFragment.newInstance(position); 
     default: 
      return null; 
    } 
} 

@Override 
public int getCount() { 
    return mPageTitles != null ? mPageTitles.length : 0; 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    return mPageTitles[position]; 
} 
} 

Et celui du Fragment:

public class StoreListFragment extends Fragment implements MyListListener { 

@Bind(R.id.store_list) RecyclerView mStoreContentView; 

private ArrayList<StoreModel> mStoreContents = new ArrayList<>(); 

public static StoreListFragment newInstance(int page) { 
    return new StoreListFragment(); 
} 


@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mStoreContents.add(new Schedule()); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_store_list, container, false); 
    ButterKnife.bind(this, v); 
    return v; 
} 

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    setupList(); 
} 

protected void setupList() { 
    LinearLayoutManager layoutManager = new LinearLayoutManager(this.getActivity()); 
    mStoreContentView.setHasFixedSize(true); 
    mStoreContentView.setLayoutManager(layoutManager); 
    mStoreContentView.setAdapter(new ArrayAdapter(this, mStoreContents, R.layout.list_elem_locations)); 
} 

@Override 
public void onClickElement(int elementId, String elementName) { 
    Intent i = new Intent(this.getActivity(), DetailActivity.class); 
    startActivity(i); 
} 
} 
+1

peut-être vous pouvez essayer en maintenant trois fragments dans la mémoire par 'mPager.setOffscreenPageLimit (3)' dans votre 'StoreFragment' –

+0

Merci bourgeon, qui fonctionnait vraiment très bien. Pourtant, je suis dérangé par le comportement de RecyclerView. Je pense qu'il me manque toujours quelque chose dans mon code, mais pour l'instant ça va marcher. – TheNewKid

+0

Le message d'avertissement de journal bizarre n'a pas d'importance et a été supprimé dans Support Library v24.0.0 La réponse officielle de développeur est: https://code.google.com/p/android/issues/detail?id=202037 – lejonl

Répondre

0

Je pense que votre problème est ici:

public static StoreListFragment newInstance(int page) { 
return new StoreListFragment(); 
} 

Vous n'utilisez cette page nulle part et vous obtenez deux StoreListFragments complètement identiques. Vous devez ajouter:

Bundle args = new Bundle(); 
    args.putInt("key", page); 
    fragment.setArguments(args); 

Ensuite, utilisez cette différenciation quelque part.

+0

C'était comme Au début, je dois l'avoir supprimé en recherchant la racine du problème. J'ai essayé de l'ajouter à nouveau mais cela n'a pas résolu le problème. – TheNewKid