5

Dans mon application il y a 2 onglets (Android design Support Library) c'est le Fragment avec ViewPagerAdapter:Android ViewPager Actualiser fragment

public class ListaCanali extends Fragment { 

public static TabLayout tabLayout; 
public static ViewPager viewPager; 
public static int int_items = 2 ; 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v =inflater.inflate(R.layout.lista_canali, container,false); 

    //Titolo Fragment 
    ((MainActivity) getActivity()).setActionBarTitle("Lista Canali"); 

    //FindViewById 
    tabLayout = (TabLayout) v.findViewById(R.id.tabs); 
    viewPager = (ViewPager) v.findViewById(R.id.viewpager); 

    //Funzioni Tab 
    viewPager.setAdapter(new MyAdapter(getChildFragmentManager())); 
    tabLayout.post(new Runnable() { 
     @Override 
     public void run() { 
      tabLayout.setupWithViewPager(viewPager); 
     } 
    }); 

    return v; 
} 


//Adattatore Tab 
class MyAdapter extends FragmentPagerAdapter { 

    public MyAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) 
    { 
     switch (position){ 
      case 0 : return new FragmentCanali(); 
      case 1 : return new FragmentPreferiti(); 
     } 
     return null; 
    } 

    public int getCount() { 

     return int_items; 

    } 

    public CharSequence getPageTitle(int position) { 

     switch (position){ 
      case 0 : 
       return "Tutti"; 
      case 1 : 
       return "Preferiti"; 
     } 
     return null; 
    } 

Je veux que mon application fragment de rafraîchissement sur Swipe et cliquez sur le titre de onglets parce que ce don Ça n'arrivera pas, j'espère que vous pourrez m'aider les gars.

+0

vous pouvez vérifier [cet exemple] (https: // GitHub.com/CabezasGonzalezJavier/RefreshCurrentFragmentWithinViewPager) – Cabezas

Répondre

5

Je suis sûr que ce n'est pas le seul/la meilleure façon de le faire. Mais cela devrait résoudre le problème comme il me l'a fait.

Veuillez écrire les méthodes refresh() à la fois dans FragmentCanali et FragmentPreferiti Fragments.

public class ListCanali extends Fragment implements OnPageChangeListener{ 
    private MyAdapter mAdapter; 

    @Override 
    public View OnCreateView (...) { 
    ... 
    if(mAdapter == null) { 
    mAdapter = new MyAdapter(getChildFragmentManager()); 
    } 
    viewPager.setAdapter(mAdapter); 
    viewPager.setOnPageChangeListener(this); 
    ... 
    } 

    ... 
    @Override 
    public void OnPageSelected (int position) { 
    switch (position){ 
      case 0 : ((FragmentCanali)adapter.getItem(position)).refresh(); 
      case 1 : ((FragmentPreferiti)adapter.getItem(position)).refresh(); 
     } 
    }} 

Il sera plus propre si vous étendez les deux fragments d'un fragment de base qui a une méthode abstraite refresh().

Dans le onPageSelected(), vous pouvez simplement appeler ((BaseFragment)adapter.getItem(position)).refresh()

4

Try this ...

Pour actualiser un fragment dont vous avez besoin, il est par exemple d'abord.

changer cette

viewPager.setAdapter(new MyAdapter(getChildFragmentManager())); 

à

ArrayList<Fragment> fr_list = new ArrayList<Fragment>(); 
fr_list.add(new FragmentCanali()); 
fr_list.add(new FragmentPreferiti()); 
MyAdapter mMyAdapter = new MyAdapter(getChildFragmentManager(),fr_list); 
viewPager.setAdapter(mMyAdapter); 

adaptateur changement cette

public MyAdapter(FragmentManager fm) { 
    super(fm); 
} 

@Override 
public Fragment getItem(int position) 
{ 
    switch (position){ 
     case 0 : return new FragmentCanali(); 
     case 1 : return new FragmentPreferiti(); 
    } 
    return null; 
} 

public int getCount() { 

    return int_items; 

} 

à

public MyAdapter(FragmentManager fm,ArrayList<Fragment> fr_list) { 
    super(fm); 
    this.fr_list=fr_list; 
} 

@Override 
public Fragment getItem(int position) 
{  
     return fr_list.get(position); 
} 

public int getCount() { 

    return fr_list.size(); 

} 

ajouter refresh() méthodes dans les fragments et l'appeler à chaque fois que vous avez besoin comme ci-dessous

((FragmentCanali) mMyAdapter.fr_list.get(0)).refresh(); 
+0

Bonjour, merci, mais montrez-moi erreur ... écran: [Cliquez ICI] (http://cineblog01.be/cattura.png) –

+0

Erreur dans MyAdapter() ???? – uday

+0

Ok, j'ai résolu mais j'ai une nouvelle erreur: [CLIQUEZ ICI] (http://www.cineblog01.be/screen.png) –

3

réponse acceptée est pas bonne façon, c'est pourquoi la solution ajoutée. après une longue lutte trouver Solution de travail.

Juste notify à votre adaptateur, il travaille étonnant,

Reference code

void setAdapter(int position) { 
     PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager()); 
     viewPager.setAdapter(pagerAdapter); 
     // when notify then set manually current position. 
     viewPager.setCurrentItem(position); 
     pagerAdapter.notifyDataSetChanged(); 
    } 

call this code when you set adapter and when you want to refresh UI.

Votre fragment ajouter ci-dessous le code pour le rafraîchissement UI

((YourActivityName) getContext()).setAdapter(selectedTabPosition); 

Utilisez instanceof pour le contexte de diffusion.

Ce partage de code qu'aider but qui trouver une solution de travail, avec un minimum de code

+0

Je reçois une exception de pointeur null. Voulez-vous m'aider s'il vous plaît. – Tara

+0

dans quelle ligne vous obtenez une erreur, pouvez-vous vérifier viewpager est init ou pas –

+0

((YourActivityName) getContext()). SetAdapter (selectedTabPosition); je l'utilise dans les fragments enfant – Tara