如何在Recycler.Adapter上调用getFragmentManager?

我正在将我的应用程序的ListView转换为RecyclerView。 在ListView上,实现OnClickListener非常容易,但在RecyclerView中,我们必须在适配器中执行它。 我想在用户点击某个项目时打开一个新的片段。 要做到这一点,我必须在适配器中调用FragmentManager,我无法做到。 这是我的RecyclerAdapter代码:

public ListItemViewHolder(View itemView) { super(itemView); title = (TextView) itemView.findViewById(R.id.title); description = (TextView) itemView.findViewById(R.id.description); itemView.setOnClickListener(this); } @Override public void onClick(View v) { //Call FragmentManager and add Fragment to it. } } 

那么,如何调用FragmentManager并在其中添加Fragments。 有没有比sendBroadcast或任何其他方法更好的方法。

  • 奇怪的问题刷新ViewPager与新的内容:
  • Viewpager和FragmentPagerAdapter:页面视图删除
  • 在应用程序启动时closures导航抽屉
  • Android片段在方向更改时重新创建
  • Android片段中的自定义属性
  • 运行Android应用程序时出错 - 无法初始化OpenglES仿真,使用'-gpu off'来禁用它
  • 片段生命周期中的onCreateOptionsMenu
  • 如何从片段中的onActivityResult获取结果?
  • 您只需要在构造函数中传递一个活动上下文。 一定要从活动和new Adapter(getActivity(),...)调用new Adapter(this,...)

     private Context context; @Override public void onClick(View v) { FragmentManager manager = ((Activity) context).getFragmentManager(); } 

    要添加到已批准的答案:如果仍然出现错误,则可能需要替换此行;

     FragmentManager manager = ((Activity)context).getFragmentManager(); 

    有了这个

     FragmentManager manager = ((AppCompatActivity)context).getSupportFragmentManager(); 

    对我来说这是因为我使用的是support.v4.app.FragmentManager而不是常规的fragmentmanager

    仍然出错?

    正如下面的一条评论所指出的,这可能会抛出一个java.lang.ClassCastException:并且log ... cannot be cast to android.support.v7.app.AppCompatActivity (查看注释以获取详细信息)

    他们的修复是使用它(我没有测试它,但它适用于他们):

     ((AppCompatActivity)activity).getSupportFragmentManager() 

    最好的选择可能是让Fragment实例化RecyclerAdapter来实现和接口,如下所示:

     public class MyRecyclerAdapter extends Adapter { private ItemType[] mItems; private MRAItemClickedListener mListener; public MyRecyclerAdapter(Context ctx, MRAItemClickedListener listener){ mListener = listener; ... } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.itemView.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { mListener.onItemClicked(mItems[position]); } }); } interface MRAItemClickedListener { void onItemClicked(ItemType item); } } public class MyFragment ... implements MRAItemClickedListener { public void onItemClicked(ItemType item){ // do stuff with item } } 

    您只需要在构造函数中传递一个活动上下文。 一定要从活动和new Adapter(getActivity(),...)调用新的Adapter(this,...)

    private Context context; @Override public void onClick(View v) { FragmentManager manager = ((Activity) context).getFragmentManager();}

    确保将上下文传递给ArrayAdapter或RecyclerViewAdpater,以便我们可以在Adapter Class中获取它。

    如果您的mainActivity正在扩展Activity,那么使用:

      FragmentManager fragmentManager = ((Activity)context).getFragmentManager(); 

    如果您的mainActivity正在扩展AppCompatActivity,那么使用:

     FragmentManager fragmentManager = ((AppCompatActivity)context).getSupportFragmentManager(); 

    我知道这对你来说太迟了,但对于其他可能看到这个的人来说。

    因此,在第一次初始化适配器时,您可以传递片段的上下文,而不是m vai。

    因此,在适配器的构造函数中,您可以添加这样的参数

      // variable to hold fragment private Fragment fragment; public MyCustomAdapter(Fragment fragment) { this.fragment = fragment; } 

    在你的片段中,你可以像这样初始化

      MyCustomAdapter myAdapter = new MyCustomAdapter(this); 

    最后你可以打电话

     Fragment fragment = new myNewFragment(); FragmentManager fragmentManager = context.getFragmentManager(); fragmentManager.beginTransaction().replace(R.id.fragment_container, fragment) .commit(); 

    所以你可以开始一个新的片段

    您可以在创建viewholder时传递FragmentManager引用,因此Viewholder的类可以如下所示

     class ListItemViewHolder { FragmentManager manager; public ListItemViewHolder(View itemView,FragmentManager manager) { super(itemView); title = (TextView) itemView.findViewById(R.id.title); description = (TextView) itemView.findViewById(R.id.description); itemView.setOnClickListener(this); this.manager = manager; } @Override public void onClick(View v) { //Call FragmentManager and add Fragment to it. manager.beginTransaction... } }