0

Derzeit versuche ich, einen Pager mit verschachtelten Ansichten zu erstellen, der ein Fragment verwendet. Wie kann ich auf die oberste übergeordnete Funktion zugreifen, um die Ansicht zu aktualisieren?Verschachteltes untergeordnetes Fragment mit Viewpager

Lassen Sie uns sagen, ich habe:

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

und hier mein Objekt

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

fragment

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

letzte Kind Fragment

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

} 

Momentan bekomme ich Null auf dem Detailfragment refreshParentView

Irgendwelche Vorschläge? Vielen Dank im Voraus

Antwort

1

Sie nennen könnte eine interface als Listener für Veranstaltungen nutzen in dem Kind passiert

public interface Listener{ 
    void onRefreshButtonClicked(); 
} 

Das Kindfragment muss ein Listener als Feld haben, und dann können Sie die Listener setzen, wenn Sie ein i nstance des Kindfragments.

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

Ein Vorteil davon, wie dies zu tun ist, dass Sie brauchen, um die übergeordneten Fragment-ParentFragment nicht gegossen, die Ihr Code wiederverwendbar machen, sollten Sie jemals für Ihre Antwort auf

+0

Danke das ist hilfreich gespeichert mein Tag: D –

0

Wenn Sie Ihr DetailFragment hinzufügen, tun Sie es mit einem Tag, so dass Sie die Instanz abrufen können, wenn Sie sie benötigen. Beispiel:

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

Jetzt, jedes Mal, wenn dieses Fragment zugreifen müssen, benötigen Sie nur

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

Dank brauchen es ist richtig wenn auf den zweiten Elternteil zugreifen, aber ich muss auf den Anfang des Elternteils zugreifen (ParentFragment (this) -> DetailFragment (nicht das) -> DetailChildFragment), danke mann –