2017-09-29 2 views
2

J'ai une collection de fragments comme: [Fragment1] [Fragment2] [Fragment3]Impossible de remplacer le fragment à l'intérieur ViewPager

J'utilise ViewPager et FragmentPagerAdapter. Ce que j'essaie de faire est de remplacer Fragment2 par un autre fragment (appelons-le Fragment4), quand une vue à l'intérieur de Fragment2 est cliquée. J'utilise le code ci-dessous:

newMsgBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       swapFragment(new Fragment4()); 
      } 
     }); 
    private void swapFragment(Fragment fragment){ 
     FragmentTransaction fragmentTransaction = ((FragmentActivity)getContext()).getSupportFragmentManager().beginTransaction(); 
     fragmentTransaction.replace(R.id.view_container,fragment); 
     fragmentTransaction.addToBackStack(null); 
     fragmentTransaction.commit(); 
    } 

Puis, quand je clique sur le newMsgBtn, il détecter le clic, mais il est incapable de changer le fragment. Une idée de comment faire cela? merci

Répondre

0

Je pense que cela devrait être fait dans votre FragmentStatePagerAdapter. Vous devriez faire quelque chose comme:

new FragmentStatePagerAdapter(fm) { 
public int getCount() { 
    return fragments.size(); // the fragments list 
} 

public Fragment getItem(int position) { 
    return fragments.get(position); 
} 

public int getItemPosition(Object item) { 
     return POSITION_NONE; 
} 
} 

Chaque fois que vous voulez changer votre fragment viewpager, vous pouvez appeler:

fragments.remove(1); //remove your fragment 2 
fragments.add(1,fragment4); // add your fragment4 into the 2 position 
viewPagerAdapter.notifyDataSetChanged(); 
+0

mais comment puis-je revenir à fragment2 de fragment4 onBackPressed()? Merci – VincentTheonardo

+0

Je ne peux pas remplacer le fragment, même après avoir notifié l'adaptateur – VincentTheonardo

1

En plus de Kingfisher Phuocr answer, vous pouvez modifier le fragment dans cette méthode

@Override 
public void onBackPressed() { 
    ArrayList myList = FragmentStatePagerAdapter.customFragmentsArrayList.remove(position); 
    myList.add(position,new Fragment_Number()); //i.e. your fragment number 
    viewPagerAdapter.notifyDataSetChanged(); 
} 
+0

Je ne peux pas changer la vue même après avoir appelé notifyDataSetChanged() – VincentTheonardo

+0

Bon, attendez. Je suis en train de travailler dessus. – Dennis

+0

Découvrez mon autre réponse. – Dennis

0

est ici le correctif:

private void changeFragment(Fragment fragment) { 
    MainActivity activity = (MainActivity) getActivity(); 
    activity.adapter.fragmentList.remove(0); 
    activity.adapter.fragmentTitleList.remove(0); 
    activity.adapter.fragmentList.add(0,fragment); 
    activity.adapter.fragmentTitleList.add(0,fragment.getClass().getSimpleName()); 
    activity.pager.getAdapter().notifyDataSetChanged(); 
} 

Assurez-vous que l'objet adapter et l'instance pager (ViewPager) sont publics.