来自Fragment的Adapter的ViewHolder启动Activity,Activity如何与Fragment对话?

时间:2019-07-11 17:51:59

标签: java android android-fragments android-activity

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 :(得分:0)

我建议您最好从片段到适配器使用 Interface 。因此,当用户单击适配器中的任何内容时,将在片段中调用函数实现。如果您需要进行活动以进行某些操作-应该从片段中调用(((YourActivity)getActivity())。someMethod()

第二招正在使用广播接收器发送事件。有点复杂。您必须启动广播以查看您需要接收消息并从适配器发送这些消息。如果系统广泛分布,则这种方法更容易调试和支持,因此最好使用接口。

答案 1 :(得分:0)

我将通过接口执行一个通用的“上下文”类(ComContext)。当您创建片段时,您还将创建此类。从活动中,您可以检查它是否存在。

我假设您已经有一个带有静态变量的helper(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;
}

答案 2 :(得分:0)

有几种方法可以做到这一点。最简单的方法应该是从PublicPlaylistActivity开始startActivityForResult。这样,活动结束,您可以设置将一些数据发送到调用方片段(在您的情况下为PlaylistFragment)。这是有关实现的nice tutorial

另一种方法是使用生命周期方法。您可能有一个public static变量,可以跟踪从onResume返回时在PlaylistFragment的{​​{1}}函数中可能观察到的某些状态。您可以考虑以下示例实现。

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; } Here is a tutorial讨论如何实施。

这实际上取决于您如何构建整个活动片段沟通。希望有帮助!