Как обновить предыдущий фрагмент после закрытия активности, которая была запущена внутри адаптера?

У меня есть фрагмент (FragmentA) с RecyclerView, отображающим некоторые CardView. Я хотел сделать интерактивные карты доступными, поэтому решение, которое я нашел для этого, было реализовать View.OnClickListener в классе ViewHolder внутри класса адаптера. Что-то вроде этого:

fragmentAAdapter.java

public class fragmentAViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { public fragmentAViewHolder (View itemView) { super(itemView); itemView.setOnClickListener(this); } @Override public void onClick(View v) { //do something.. } } 

Метод onClick () получает данные из щелчка карты и запускает активность (InfoActivity), которая отображает данные.

Метод OnClick ()

 @Override public void onClick(View v) { Intent intent = new Intent(itemView.getContext(), InfoActivity.class); Bundle mBundle = new Bundle(); mBundle.putParcelable("someData", someData); intent.putExtras(mBundle); itemView.getContext().startActivity(intent); } 

В InfoActivity я могу обновлять и удалять данные. После этого я хочу закончить InfoActivity и обновить FragmentA, чтобы получить новые данные.

Чтобы закрыть активность и обновить предыдущий фрагмент, я пытаюсь использовать startActivityForResult () . Как это:

 @Override public void onClick(View v) { Intent intent = new Intent(itemView.getContext(), InfoActivity.class); ((Activity) itemView.getContext()).startActivityForResult(intent, 10001); } 

InfoActivity.java

 @Override public void onClick(DialogInterface dialog, int which) { setResult(InfoActivity.RESULT_OK); finish(); } 

FragmentA.java

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if ((requestCode == 10001) && (resultCode == InfoActivity.RESULT_OK)) { FragmentAfragment = new FragmentA(); android.support.v4.app.FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.fragment_container, fragment); fragmentTransaction.commit(); } } 

Но когда я закрываю InfoActivity, ничего не происходит.

Проблема заключается в том, что setResult (InfoActivity.RESULT_OK) возвращает результат в класс адаптера (фрагментAAdapter), а не в FragmentA, поэтому метод onActivityResult () в FragmentA никогда не вызывается.

Как обновить FragmentA после закрытия InfoActivity, который был запущен внутри метода onClick () в файле fragAAdapter?


Обновление – решение

Я перезаписал метод onActivityResult () в деятельности FragmentA. Как это:

MainActivity.java

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if ((requestCode == 10001) && (resultCode == 10001)) { FragmentA fragment = new FragmentA(); android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.fragment_container, fragment); fragmentTransaction.commit(); } } 

И в InfoActivity.java :

 @Override public void onClick(DialogInterface dialog, int which) { setResult(10001); finish(); } 

Каждый раз, когда он закрывает действие и возвращается к FragmentA, вызывается onActivityResult () в MainActivity, и когда условие if ((requestCode == 10001) && (resultCode == 10001)) истинно, FragmentA обновляется.

Solutions Collecting From Web of "Как обновить предыдущий фрагмент после закрытия активности, которая была запущена внутри адаптера?"

В деятельности вашего фрагмента вы можете сделать что-то вроде этого:

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { requestCode &= 0xffff; for (Fragment fragment : getSupportFragmentManager().getFragments()) { if (fragment != null) { fragment.onActivityResult(requestCode, resultCode, data); } } super.onActivityResult(requestCode, resultCode, data); } 

Или вы можете использовать шину событий, например: http://square.github.io/otto/

Проблема, которую вы выпускаете, – это такие вещи

Фрагмент ( startActivityForResult() ) -> Активность

Фрагмент ( onActivityResult() ) <- Активность ( setResult(Result_OK) )

Вам следует избегать делать onActivityResult() в вашем классе активности, поскольку роль активности в этом процессе – это просто почтовая программа для отправки данных обратно в фрагмент.

Если вы собираетесь вызвать активность внутри фрагмента, вы можете называть его getActivity().startActivityForResult() напрямую

Фрагмент ( getActivity().startActivityForResult ) -> Активность

Activity ( onActivityResult() ) <- Активность ( setResult(Result_OK) )

#Опции

onActivityResult() фрагмент и найдите фрагмент и вызовите onActivityResult() как предложил Агустин Сивоплас.) -> Фрагмент

Даже если вы находитесь внутри держателя вида адаптера, он также должен быть расположен внутри фрагмента. Попробуйте использовать функцию фрагмента и не вставлять дополнительный код в действие

Возможный дубликат

OnActivityResult не вызывается в фрагменте