How to call getFragmentManager on Recycler.Adapter?

前端 未结 9 2111
执笔经年
执笔经年 2020-12-23 16:22

I am converting ListView of my app to RecyclerView. On ListView, it was very easy to implement OnClickListener but in RecyclerView, we have to do it in adapter. I want to op

相关标签:
9条回答
  • 2020-12-23 17:11

    Make sure to pass context to the ArrayAdapter or RecyclerViewAdpater,So that we can get it inside Adapter Class.

    If your mainActivity is extending Activity then use :

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

    If your mainActivity is extending AppCompatActivity then use :

    FragmentManager fragmentManager = ((AppCompatActivity)context).getSupportFragmentManager();
    
    0 讨论(0)
  • 2020-12-23 17:11

    Best option would probably be to have the Fragment that instantiates the RecyclerAdapter to implement and interface like this:

    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
        }
    
    }
    
    0 讨论(0)
  • 2020-12-23 17:11

    You just need an activity context passed in your constructor. Be sure to call new Adapter(this,...) from activities and new Adapter(getActivity(),...) from fragments.

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

    0 讨论(0)
  • 2020-12-23 17:12

    Instantiate the fragmentManager in the activity itself.

    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();
    }
    
    0 讨论(0)
  • 2020-12-23 17:14

    To add on to the approved answer: if you still get an error you might need to replace this line;

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

    With this

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

    For me this was because I was using the support.v4.app.FragmentManager instead of the regular fragmentmanager

    Still get an error?

    As one comment below pointed out, this might throw a java.lang.ClassCastException: and log ... cannot be cast to android.support.v7.app.AppCompatActivity (check comments for details)

    Their fix was to use this instead (I haven't tested it but it worked for them):

    ((AppCompatActivity)activity).getSupportFragmentManager()
    
    0 讨论(0)
  • 2020-12-23 17:17

    You could pass FragmentManager reference while creating viewholder so your class for Viewholder could be as follows

    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...
            }
        }
    
    0 讨论(0)
提交回复
热议问题