colymore
colymore

Reputation: 12316

Notify from child fragment inside ViewPager to his parent an event

i have a fragment inside a activity, this fragment contains a viewpager, this is the code:

public class RepliesContainerFragment extends Fragment {

    @InjectView(R.id.viewPager)
    ViewPager pager;
    private PagerAdapter adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ReplyActivity replyActivity = (ReplyActivity) getActivity();
        List<Replie> replies = getArguments().getParcelableArrayList("replies");
        adapter = new PagerAdapter(replyActivity.getSupportFragmentManager(), replies);
        setActionBar();
    }

    private void setActionBar() {
        getActivity().getActionBar().setDisplayHomeAsUpEnabled(false);
        getActivity().getActionBar().setIcon(getResources().getDrawable(R.drawable.ic_back));
        getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
        getActivity().getActionBar().setTitle("Respuestas");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View view = inflater.inflate(R.layout.work_containter_replies, container, false);
        ButterKnife.inject(this, view);
        pager.setAdapter(adapter);
        return view;
    }
}

Inside the adapter i had instantiate some fragments like this:

public class ReplyFragment extends Fragment {

    @InjectView(R.id.tvQuestion)
    TextView tvQuestion;
    @InjectView(R.id.frameContainter)
    FrameLayout replyContainer;
    private ReplyView replyView;
    private String question;
    private String currentReplie;
    private int replieType;
    private int questionId;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        replieType = getArguments().getInt("replyType");
        question = getArguments().getString("question");
        questionId = getArguments().getInt("questionId");
        currentReplie = getArguments().getString("currentReplie");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View view = inflater.inflate(R.layout.work_reply_fragment, container, false);
        ButterKnife.inject(this, view);
        initQuestionText();
        return view;
    }

    private void persistReply() {
        ReplyActivity replyActivity = (ReplyActivity) getActivity();
        if (replyActivity != null) {
            //DO SOMETHING
            //Notify to adapter from here
            }
        }
    }
}

As you can see, i want to notify to my RepliesContainerFragment and his inside adapter that some event happens and do an action..

How can i do it this? With broadcastreceivers, with callbacks(Interfaces)..?I am not sure.

Upvotes: 2

Views: 1968

Answers (2)

mmlooloo
mmlooloo

Reputation: 18977

I think it is easier:

 private void persistReply() {
        ReplyActivity replyActivity = (ReplyActivity) getActivity();
        if (replyActivity != null) {
            //DO SOMETHING
             RepliesContainerFragment frag = ((RepliesContainerFragment)this.getParentFragment());
             frag.getAdapter().notifyDataSetChanged(); 
            }
        }
 }

and make getter setter for adapter

Upvotes: 0

Ayzen
Ayzen

Reputation: 983

The very simple solution for this is to pass a listener instance from your parent fragment to a child fragment. You have to create a listener interface, create an instance of it in your parent fragment, and pass that instance to all your children fragments.

By the way there is a topic regarding this problem in the official tutorial.

Hope this helps.

Upvotes: 1

Related Questions