You should use listener interface mechanism to communicate between your fragment back to your activity.
Assuming MainActivity contains FragmentA and FragmentB:
To let the activity know which product was selected on FragmentB:
public class MainActivity extends AppCompatActivity implements FragmentBListener {
...
@Override
public void onProductSelected(Product product) {
showFragmentAWithProduct(product);
}
private void showFragmentAWithProduct(Product product) {
// Logic to show FragmentA
}
}
public class FragmentB extends Fragment {
private FragmentBListener mListener;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
yourListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Product product = // Get the selected product
mListener.onProductSelected(product);
}
});
...
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
mListener = (FragmentBListener) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString()
+ " must implement " + FragmentBListener.class.toString());
}
}
public interface FragmentBListener {
void onProductSelected(Product product);
}
}
To pass arguments to FragmentA or B you can expose a public method with those arguments to refresh the fragment or you can instantiate the Fragment with the arguments doing this:
public class FragmentX extends Fragment {
public static FragmentX newInstance(Param1 param1, Param2 param2) {
FragmentX fragment = new FragmentX();
Bundle args = new Bundle();
args.putXXX(key1, param1);
args.putXXX(key2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
Param1 param1 = getArguments().getXXX(key1);
Param2 param2 = getArguments().getXXX(key2);
...
}
}
...
}