ViewHolder из Адаптера из Фрагмента запускает Активность, как Активность может общаться с Фрагментом? - PullRequest
0 голосов
/ 11 июля 2019

PlaylistFragment запускает адаптер:

playlistsAdapter = new PlaylistRecyclerAdapter(playlistsListArray, addToPlaylist, mSong, getActivity(), this);

PlaylistRecyclerAdapter привязывает данные к PlaylistViewHolder, что-то вроде этого:

((PlaylistViewHolder) viewHolder).bind(this, dataSet.get(position), addToPlaylist, mSong);

Пользователь нажимает на элемент в PlaylistViewHolder:

context.startActivity(PublicPlaylistActivity.createStartIntent(context, playlist));

Теперь возникает вопрос, как PublicPlaylistActivity может ответить на начальный PlaylistFragment?

Ответы [ 3 ]

0 голосов
/ 11 июля 2019

Я бы сделал общий "контекстный" класс (ComContext) с интерфейсом. Когда вы создаете свой фрагмент, вы также создаете этот класс. И по активности вы можете проверить, существует она или нет.

Я предполагаю, что у вас уже есть вспомогательный класс (AppHelper) со статическими переменными.

public class AppHelper {
   public static ComContext comContext = null;
}

public class MainFragment {

   @Override
   public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
      super.onViewCreated(view, savedInstanceState);

      ConContext comContext = new ComContext();
      comContext.listener = this;
      AppHelper.comContext = comContext;
   }

   @Override
   public void onDataChanged() {

   }

   @Override
   public void onDestroyView() {
       super.onDestroyView();
       AppHelper.comContext = null;
   }

}

public class MainActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      if (AppHelper.comContext != null) {
         AppHelper.comContext.listener.onDataChanged();
      }
   }
}

public class ComContext {
   public interface HelperListener {
      void onDataChanged();
   }

   public HelperListener listener = null;
}
0 голосов
/ 11 июля 2019

Есть несколько способов сделать это. Самый простой способ - начать PublicPlaylistActivity с startActivityForResult. Таким образом, затем действие заканчивается, вы можете установить отправку некоторых данных фрагменту вызывающего абонента (в вашем случае это PlaylistFragment). Вот хороший учебник о реализации.

Еще один способ сделать это - использовать методы жизненного цикла. У вас может быть переменная public static, которая может отслеживать какой-то статус, который вы можете наблюдать в вашей функции onResume вашего PlaylistFragment, когда вы возвращаетесь из своего PublicPlaylistActivity. Вы можете рассмотреть пример реализации следующим образом.

Определите переменную public static в вашем PlaylistFragment. Затем в вашей функции onResume проверьте значение этой переменной и выполните соответствующие действия.

public static boolean someIndicator = false; // Initialize with a default value

@Override
protected void onResume() {
    super.onResume();

    if(someIndicator == true) doSomething();
    else doSomethingElse();
}

Теперь вы можете установить переменную индикатора из любой точки вашего приложения, что будет влиять на ваш PlaylistFragment. Например, из вашего PublicPlaylistActivity вы можете подумать о том, чтобы сделать что-то подобное.

public void someFunctionInYourPublicPlaylistActivity() {
    // ... 
    // Some code and then the following
    PlaylistFragment.someIndicator = true;
}

Еще один способ добиться того же - использовать BroadcastReceiver. Вот учебник о том, как его реализовать.

Это действительно зависит от того, как вы структурируете всю свою связь между фрагментами деятельности. Надеюсь, это поможет!

0 голосов
/ 11 июля 2019

Я предлагаю вам лучше использовать Интерфейс от фрагмента к адаптеру. Поэтому, когда пользователь щелкает что-либо в адаптере, вызывайте реализацию функции фрагментом. Если для выполнения какой-либо операции требуется выполнение вашей операции - ((YourActivity) getActivity ()). SomeMethod () следует вызывать из фрагмента.

Второй трюк использует широковещательный приемник для отправки событий. Немного сложнее Вы должны запустить трансляцию с учетом того, что вам нужно получить сообщение и отправить эти сообщения с адаптера. Этот подход является более гибким для отладки и поддержки, если система широко распространена, поэтому вам лучше использовать интерфейсы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...