如何在Recycler.Adapter上调用getFragmentManager?

时间:2015-06-16 11:58:29

标签: android android-fragments

我正在将我的应用的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或任何其他方法更好的方法。

9 个答案:

答案 0 :(得分:48)

您只需要在构造函数中传递一个活动上下文。请务必从活动中调用new Adapter(this,...),从片段调用new Adapter(getActivity(),...)

private Context context;

@Override
public void onClick(View v) {
    FragmentManager manager = ((AppCompatActivity)context).getSupportFragmentManager();
}

答案 1 :(得分:42)

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

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

有了这个

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

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

仍然出错?

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

他们的解决方法是使用它(我没有测试它,但它适用于它们):

((AppCompatActivity)activity).getSupportFragmentManager()

答案 2 :(得分:5)

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

如果您的mainActivity正在扩展活动,请使用:

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

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

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

答案 3 :(得分:4)

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

BidiMap

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

我知道这对你来说已经太晚了,但对于那些可能会看到这一点的人来说已经太晚了。

因此,当你第一次初始化适配器时,你可以传递片段的上下文,而不是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();

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

答案 6 :(得分:1)

在活动本身中实例化fragmentManager。

MyActivity.java

 FragmentManager fragmentManager = getFragmentManager();
 adapter = new CustomAdapter(productsList, fragmentManager);

CustomAdapter.java

 CustomAdapter implements MyClickListner{
 CustomAdapter(Arraylist<MyProduct>productsList, FragmentManager fragmentManager) {
      this.productList = productsList;
      this.fragmentManager = fragmentManager;
 }

 @override
  clickFunction(){
     Fragment myFragment= new MyFilterFragment();
     ((MyFilterFragment) myFragment).show(this.fragmentManager,"tag");
  }

MyClickListener.java

public interface MyClickListener(){
   public clickFunction();
}

答案 7 :(得分:1)

在kotlin中,您可以使用以下代码:

    val fm : FragmentManager= (context as AppCompatActivity).supportFragmentManager

答案 8 :(得分:0)

您可以在创建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...
        }
    }