如何在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或任何其他方法更好的方法。

Solutions Collecting From Web of "如何在Recycler.Adapter上调用getFragmentManager?"

您只需要在构造函数中传递一个活动上下文。 一定要从活动和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... } }