如何在Recycler.Adapter上调用getFragmentManager?

MSa*_*ati 34 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.
            }
        }
Run Code Online (Sandbox Code Playgroud)

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

nat*_*rio 59

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

private Context context;

@Override
public void onClick(View v) {
    FragmentManager manager = ((AppCompatActivity)context).getSupportFragmentManager();
}
Run Code Online (Sandbox Code Playgroud)

  • FragmentManager manager =((AppCompatActivity)context).getSupportFragmentManager(); (9认同)

Isa*_*tim 42

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

FragmentManager manager = ((Activity)context).getFragmentManager();
Run Code Online (Sandbox Code Playgroud)

有了这个

FragmentManager manager = ((AppCompatActivity)context).getSupportFragmentManager();
Run Code Online (Sandbox Code Playgroud)

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

仍然出错?

正如下面的一条评论所指出的,这可能会抛出一个java.lang.ClassCastException:和日志... cannot be cast to android.support.v7.app.AppCompatActivity(查看详细评论)

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

((AppCompatActivity)activity).getSupportFragmentManager()
Run Code Online (Sandbox Code Playgroud)

  • 这很有效.((AppCompatActivity)活性).getSupportFragmentManager() (2认同)
  • @Debasish感谢您添加解决方案 (2认同)

KML*_*ong 6

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

public class MyRecyclerAdapter extends Adapter<RecyclerAdapter.ViewHolder> {

     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
    }

}
Run Code Online (Sandbox Code Playgroud)


Abh*_*pta 6

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

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

 FragmentManager fragmentManager = ((Activity)context).getFragmentManager();
Run Code Online (Sandbox Code Playgroud)

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

FragmentManager fragmentManager = ((AppCompatActivity)context).getSupportFragmentManager();
Run Code Online (Sandbox Code Playgroud)


小智 5

在 kotlin 中你可以使用这段代码:

    val fm : FragmentManager= (context as AppCompatActivity).supportFragmentManager
Run Code Online (Sandbox Code Playgroud)