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.
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();
}
À 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()
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
}
}
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();
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();}
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
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...
}
}