简体   繁体   中英

How to communicate with fragments inside FragmentStatePagerAdapter?

I'm trying to update the content of all the fragments inside TabAdapter class based on the data input in the GradeFragment. In the GradeFragment I'm updating Grupe object but I'm unable to notify other fragments when it happens. I've tried to use an interface but I can't attach it to the GradeFragment. How can I achieve this?

Here's my TabAdapter class:

public class TabAdapter extends FragmentStatePagerAdapter  {


private int totalTabs;
private Grupe grupe;
private GradeFragment gradeFragment;


public TabAdapter(FragmentManager fm, int totalTabs, Grupe grupe) {
    super(fm);
    this.totalTabs = totalTabs;
    this.grupe = grupe;
}

// this is for fragment tabs
@Override
public Fragment getItem(int position) {
    Bundle bundle = new Bundle();
    bundle.putSerializable("gr", grupe);
    switch (position) {
        case 0:
            gradeFragment = new GradeFragment();
            gradeFragment.setArguments(bundle);
            return gradeFragment;
        case 1:
            GradeAverageFragment gradeAverageFragment = new GradeAverageFragment();
            gradeAverageFragment.setArguments(bundle);
            return gradeAverageFragment;
        case 2:
            GroupAverageFragment groupAverageFragment = new GroupAverageFragment();
            groupAverageFragment.setArguments(bundle);
            return groupAverageFragment;
        case 3:
            TopGradesFragment topGradesFragment = new TopGradesFragment();
            topGradesFragment.setArguments(bundle);
            return topGradesFragment;
        default:
            return null;
    }
}
// this counts total number of tabs
@Override
public int getCount() {
    return totalTabs;
}


}

Set GradeFragment as target fragment for each other Fragment ( GradeAverageFragment , GroupAverageFragment , TopGradesFragment ...) like this:

GradeAverageFragment gradeAverageFragment = new GradeAverageFragment();
gradeAverageFragment.setArguments(bundle);
gradeAverageFragment.setTargetFragment(gradeFragment, 0);
return gradeAverageFragment;

Simple prototype:

interface OnUpdateGrupeListener {

    void onGrupeUpdated(Grupe newGrupe);
}

interface UpdateGrupeHost {

    void onAttachUpdateGrupeListener(OnUpdateGrupeListener listener);

    void onDetachUpdateGrupeListener(OnUpdateGrupeListener listener);
}

public static class GradeFragment extends Fragment implements UpdateGrupeHost {

    private final ArrayList<OnUpdateGrupeListener> listeners = new ArrayList<>();

    @Override
    public void onAttachUpdateGrupeListener(OnUpdateGrupeListener listener) {
        listeners.add(listener);
    }

    @Override
    public void onDetachUpdateGrupeListener(OnUpdateGrupeListener listener) {
        listeners.remove(listener);
    }

    private void notifyOthers(Grupe newGrupe) {
        for (OnUpdateGrupeListener l : listeners) {
            l.onGrupeUpdated(newGrupe);
        }
    }
}

/* 
GradeAverageFragment, 
GroupAverageFragment, 
TopGradesFragment 
*/
public static class GradeAverageFragment extends Fragment implements OnUpdateGrupeListener {

    @Nullable
    private UpdateGrupeHost callback;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (getTargetFragment() instanceof UpdateGrupeHost) {
            callback = (UpdateGrupeHost) getTargetFragment();
            callback.onAttachUpdateGrupeListener(this);
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        if (callback != null) {
            callback.onDetachUpdateGrupeListener(this);
        }
        callback = null;
    }

    @Override
    public void onGrupeUpdated(Grupe newGrupe) {
        // updated grupe received
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM