0

Actuellement, j'essaie de créer un pagineur de vue imbriqué à l'aide d'un fragment, comment puis-je accéder à la fonction parent supérieure pour actualiser la vue?Fragment enfant imbriqué avec Viewpager

Disons que j'ai:

public class ParentFragment extends Fragment { 

    ...{ 
    ... 
    viewPagerAdapter = new ViewPagerParentAdapter(getChildFragmentManager(), listOfItem); 
    viewPager.setAdapter(viewPagerAdapter); 
    } 

public void refreshView(){ 
    loadData(); 
} 


private class ViewPagerParentAdapter extends FragmentStatePagerAdapter{ 
    private List<String> tabTitle; 
    private List<Item> listOfItem; 
    public ViewPagerParentAdapter(FragmentManager fm, @NonNull List<Item> listOfItem) { 
     super(fm); 

     this.tabTitle = new ArrayList<>(); 
     this.listOfItem = new ArrayList<>(); 

     if (listOfItem.size() > 0) { 
      this.listOfItem = listOfItem; 

      for (Item item : this.listOfItem) { 
       tabTitle.add(Item.getCLASSIFICATION()); 
      } 
     } 
     notifyDataSetChanged(); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return DetailFragment.newInstance(getItemAtPosition(position).getDETAILS()); 
    } 

    public Item getItemAtPosition(int position) { 
     return listOfItem != null ? listOfItem.get(position) : null; 
    } 
} 
} 

et ici mon objet

public class Item{ 
    //POJO 
    private String CLASSIFICATION; 
    private Details details; 
} 

fragment de détail

public class DetailFragment extends Fragment{ 

...{ 
    ... 
    Details details = getArguments().getParcelable("details"); 

    viewPagerAdapter = new DetailViewPagerAdapter(getChildFragmentManager(), details); 
    viewPagerDetails.setAdapter(viewPagerAdapter); 
} 

public void refreshParentView(){ 
    ((ParentFragment) getParentFragment()).refreshView(); //getting Null 
} 

public class DetailViewPagerAdapter extends FragmentStatePagerAdapter { 

    String[] tabTitle = {"Components", "Materials", "Descriptions"}; 
    Details details; 


    public DetailViewPagerAdapter(FragmentManager fm, @NonNull Details details) { 
     super(fm); 
     this.details = details; 
     notifyDataSetChanged(); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       return DetailsChildFragment.newInstance(details.getCOMPONENT()); 
      case 1: 
       return DetailsChildFragment.newInstance(details.getMATERIAL()); 
      case 2: 
       return DetailsChildFragment.newInstance(details.getDESC()); 
     } 
     return null; 
    } 

    @Override 
    public int getCount() { 
     return tabTitle.length; 
    } 
} 
} 

fragment enfant dernier

public class DetailsChildFragment extends Fragment implements View.OnClickListener{ 

...{ 
... 
... 

Button buttonRefresh = (Button)getView().findViewById(R.id.button_refresh); 
buttonRefresh.setOnClickListener(this); 
} 

@Override 
public void onClick(View view){ 
    switch(view.getId()){ 
     case R.id.button_refresh: 
      ((DetailFragment)getParentFragment()).refreshParentView(); 
     break; 
    } 
} 

} 

Actuellement, je reçois nul sur le fragment de détail refreshParentView

Toutes les suggestions? Merci d'avance

Répondre

1

Vous pouvez utiliser un interface comme Listener pour les événements qui se produisent chez l'enfant

public interface Listener{ 
    void onRefreshButtonClicked(); 
} 

Le fragment enfant doit avoir un Listener comme champ, puis vous pouvez définir Listener lors de l'obtention d'un i nstance du fragment enfant.

public class ChildFragment extends Fragment{ 

private Listener listener; 

public void setListener(Listener listener)//setter 
... 

//now on button click you call the listener 
refreshButton.setOnClickListener(new View.OnClickListener(){ 

    @Override onClick(){ 
     if(listener!=null){ 
      listener.onRefreshButtonClicked(); 
     } 
    } 
} 




public class ParentFragment extends Fragment{ 
    ... 


    ChildFragment child = ChildFragment.getInstance() 
    child.setListener(new Listener(){ 
     @Override 
     void onRefreshButtonClicked(){ 
// implement your logic 
     } 
    } 

Un avantage de le faire comme ceci est que vous n'avez pas besoin de jeter le parent Fragment-ParentFragment qui rend votre code réutilisables si jamais vous devez

+0

Merci c'est utile sauvé ma journée: D –

0

Lorsque vous ajoutez votre DetailFragment, faites-le avec une balise, de sorte que vous puissiez récupérer son instance quand vous en avez besoin. Exemple:

getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, detailFragment,"detailFragmentTag").commit(); 

Maintenant, chaque fois que vous avez besoin d'accéder à ce fragment, il vous suffit d'appeler

DetailFragment parentFragment = (DetailFragment) getActivity().getSupportFragmentManager().findFragmentByTag("detailFragmentTag"); 
if(detailFragment != null && detailFragment.isAdded()){ //check if it is not null and it is added to the view so you dont end up in some NPE 
    detailFragment.refreshParentView() 
+0

merci pour votre réponse, il est correct si accéder au deuxième parent, mais j'ai besoin d'accéder au sommet du parent (ParentFragment (this) -> DetailFragment (pas this) -> DetailChildFragment), merci l'homme –