Estoy convirtiendo ListView de mi aplicación a RecyclerView. En ListView, fue muy fácil implementar OnClickListener pero en RecyclerView, tenemos que hacerlo en el adaptador. Quiero abrir un nuevo Fragmento cuando el usuario hace clic en un elemento. Para hacer esto, tengo que llamar a FragmentManager en el adaptador, lo cual no puedo hacer. Este es mi código 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.
}
}
Entonces, cómo llamar a FragmentManager y agregar Fragmentos en él. ¿Hay alguna manera mejor que esta como sendBroadcast o cualquier otro método?
natario
Solo necesita un contexto de actividad pasado en su constructor. Asegúrate de llamar new Adapter(this,...)
de actividades y new Adapter(getActivity(),...)
de fragmentos.
private Context context;
@Override
public void onClick(View v) {
FragmentManager manager = ((AppCompatActivity)context).getSupportFragmentManager();
}
-
Administrador de FragmentManager = ((AppCompatActivity)context).getSupportFragmentManager();
– Codelaby
10 de julio de 2018 a las 14:07
Isaac Martín Otim
Para agregar a la respuesta aprobada: si aún recibe un error, es posible que deba reemplazar esta línea;
FragmentManager manager = ((Activity)context).getFragmentManager();
Con este
FragmentManager manager = ((AppCompatActivity)context).getSupportFragmentManager();
Para mí esto fue porque estaba usando el support.v4.app.FragmentManager
en lugar del habitual fragmentmanager
¿Aún recibes un error?
Como señaló un comentario a continuación, esto podría arrojar un java.lang.ClassCastException:
y registro ... cannot be cast to android.support.v7.app.AppCompatActivity
(verifique los comentarios para más detalles)
Su solución fue usar esto en su lugar (no lo he probado pero funcionó para ellos):
((AppCompatActivity)activity).getSupportFragmentManager()
-
Yo tuve el mismo problema. Gracias 🙂
– h8pathak
11 de julio de 2016 a las 7:40
-
@ h8pathak me alegro de que haya ayudado
–Isaac Martín Otim
18 de julio de 2016 a las 12:43
-
¡Gracias! esto me ayuda
– polares
17 de noviembre de 2016 a las 12:21
-
java.lang.ClassCastException: com.skypoint.cmdroyal.extra.AppControllerVolley no se puede enviar a android.support.v7.app.AppCompatActivity Tengo este problema. Estoy tratando de abrir esto desde los elementos del reciclador … por lo que esta línea de código está en una clase de adaptador.
– Debasish Ghosh
29 de agosto de 2017 a las 7:44
-
esto funcionó ((AppCompatActivity)actividad).getSupportFragmentManager()
– Debasish Ghosh
29 de agosto de 2017 a las 7:50
Asegúrese de pasar el contexto a ArrayAdapter o RecyclerViewAdpater, para que podamos obtenerlo dentro de la clase de adaptador.
Si su mainActivity está extendiendo la actividad, use:
FragmentManager fragmentManager = ((Activity)context).getFragmentManager();
Si su mainActivity está extendiendo AppCompatActivity, entonces use:
FragmentManager fragmentManager = ((AppCompatActivity)context).getSupportFragmentManager();
La mejor opción probablemente sería tener el Fragmento que crea una instancia del RecyclerAdapter para implementar e interactuar de esta manera:
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
}
}
Solo necesita un contexto de actividad pasado en su constructor. Asegúrese de llamar a nuevos Adapter(this,...)
de actividades y new Adapter(getActivity(),...)
de fragmentos.
private Context context;
@Override
public void onClick(View v) {
FragmentManager manager = ((Activity) context).getFragmentManager();}
ali mikaeili
en kotlin puedes usar este código:
val fm : FragmentManager= (context as AppCompatActivity).supportFragmentManager
maxib7
Sé que es demasiado tarde para ti, pero para cualquier otra persona que pueda ver esto.
Entonces, en lugar de hacer m vai did, puede pasar el contexto del fragmento cuando inicializa su adaptador por primera vez.
Entonces, en su constructor para su adaptador, puede agregar un argumento como este
// variable to hold fragment
private Fragment fragment;
public MyCustomAdapter(Fragment fragment)
{
this.fragment = fragment;
}
y en su fragmento puede simplemente inicializar si es así
MyCustomAdapter myAdapter = new MyCustomAdapter(this);
por fin puedes llamar
Fragment fragment = new myNewFragment();
FragmentManager fragmentManager = context.getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.fragment_container, fragment)
.commit();
para que puedas comenzar un nuevo fragmento
evento de burbuja hasta Recycler.Adapter (como ahora está en el soporte) y configure algún oyente para él (por ejemplo, el fragmento que crea el addapter) – ¿cómo hacer esto? fue descrito aquí en MUCHAS veces
– Selvin
16 de junio de 2015 a las 12:01
@Selvin Sé cómo llamar a FragmentManager en actividad o fragmento pero me da error en Adaptador
– algún nombre de desarrollador
16 de junio de 2015 a las 12:20