Comment appeler Getfragmentmanager sur Recycler.Adaptateur?

je convertis ListView de mon application en RecyclerView. Sur ListView, il était très facile d'implémenter OnClickListener mais dans RecyclerView, nous devons le faire en Adaptateur. Je veux ouvrir un nouveau Fragment lorsque l'utilisateur clique sur un élément. Pour ce faire, je dois appeler FragmentManager dans Adaptateur que je ne suis pas en mesure de faire. Voici mon code de 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.
            }
        }

alors, comment appeler FragmentManager et y ajouter des Fragments. Est-il mieux que cela comme sendingBroadcast ou de toute autre méthode.

25
demandé sur MSati 2015-06-16 14:58:28

7 réponses

Vous avez juste besoin d'un contexte d'activité passés en votre constructeur. Assurez-vous d'appeler new Adapter(this,...) des activités et new Adapter(getActivity(),...) à partir de fragments.

private Context context;

@Override
public void onClick(View v) {
    FragmentManager manager = ((Activity) context).getFragmentManager();
}
42
répondu natario 2015-06-16 12:21:53

À ajouter sur la approuvé réponse: si vous obtenez un message d'erreur que vous pourriez avoir besoin de remplacer la ligne;

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

avec ceci

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

Pour moi, c'était parce que j'étais à l'aide de la support.v4.app.FragmentManager au lieu de fragmentmanager

Encore une erreur?

Comme un commentaire ci-dessous indiqué, cela pourrait jeter un java.lang.ClassCastException: et log ... cannot be cast to android.support.v7.app.AppCompatActivity (vérifier les commentaires pour plus de détails)

Leur solution était de l'utiliser (je n'ai pas testé mais il a travaillé pour eux):

((AppCompatActivity)activity).getSupportFragmentManager()
40
répondu Isaac Martin Otim 2018-03-20 08:05:15

La meilleure option serait probablement d'avoir le Fragment qui instancie le RecyclerAdapter pour implémenter et interfacer comme ceci:

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
    }

}
4
répondu KMLong 2015-06-16 12:31:03

assurez-vous de passer le contexte à L'ArrayAdapter ou RecyclerViewAdpater,de sorte que nous puissions l'obtenir dans la classe Adaptateur.

si votre activité principale est l'extension de L'activité, alors utilisez:

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

si votre activité principale est l'extension de L'Appcompatacity, alors utilisez:

FragmentManager fragmentManager = ((AppCompatActivity)context).getSupportFragmentManager();
3
répondu Abhishek Sengupta 2018-05-27 06:14:45

Vous avez juste besoin d'un contexte d'activité passés en votre constructeur. Assurez-vous d'appeler de nouveaux Adapter(this,...) des activités et new Adapter(getActivity(),...) à partir de fragments.

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

2
répondu samer 2017-06-04 15:10:07

je sais que c'est trop tard pour vous, mais pour quiconque pourrait voir ça.

Donc au lieu de faire des m vai fait, vous pouvez passer le contexte du fragment lorsque vous initialisez votre adaptateur.

donc dans votre constructeur pour votre adaptateur vous pouvez ajouter un argument comme ceci

 // variable to hold fragment
 private Fragment fragment;

 public MyCustomAdapter(Fragment fragment)
 {
    this.fragment = fragment;
 }

et dans votre fragment que vous pouvez initialiser si comme ceci

 MyCustomAdapter myAdapter = new MyCustomAdapter(this);

enfin, vous pouvez appeler

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

donc vous pouvez commencer un nouveau fragment

1
répondu maxib7 2015-08-08 23:35:24

Vous pouvez passer la référence FragmentManager tout en créant viewholder de sorte que votre classe pour Viewholder pourrait être comme suit

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
répondu Harsh shah 2015-06-16 12:12:14