Cómo llamar a getFragmentManager en Recycler.Adapter?
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 que no soy capaz de 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. } }
Así que, cómo llamar a FragmentManager y agregar fragmentos en él. ¿Hay alguna mejor manera que esto como sendingBroadcast o cualquier otro método.
- RecyclerView parpadea después de notifyDatasetChanged ()
- ¿Cómo utilizar Fragments y objectAnimator en versiones anteriores de Android?
- Utilizar FragmentTransaction con un DialogFragment
- Excepción AlertDialog de Android "Resources $ NotFoundException"
- El evento onActivityResult del fragmento no se llama después del cambio de orientación
- FindViewById dentro del fragmento
- IllegalStateException: No se puede realizar esta acción después de OnSaveInstanceState en la clase FragmentActivity
- Cómo utilizar Android AppBarLayout, Toolbar y TabLayout con fragmentos
- RecyclerView no se desplaza hacia abajo
- No se pueden intercambiar fragmentos correctamente en las pestañas de la barra de acciones
- Android - SupportMapFragment con GoogleMaps API 2.0 dando IllegalArgumentException
- Cuando un fragmento ha perdido el foco y luego recupera el enfoque, ¿por qué su método onResume () nunca se llama en el período?
- ¿Es posible buscar dentro de Fragmentos?
Sólo necesita un contexto de actividad pasado en su constructor. Asegúrese de llamar al new Adapter(this,...)
de las actividades y el new Adapter(getActivity(),...)
de los fragmentos.
private Context context; @Override public void onClick(View v) { FragmentManager manager = ((Activity) context).getFragmentManager(); }
Para añadir a la respuesta aprobada: si sigue recibiendo un error, puede que tenga que reemplazar esta línea;
FragmentManager manager = ((Activity)context).getFragmentManager();
Con este
FragmentManager manager = ((AppCompatActivity)context).getSupportFragmentManager();
Para mí esto era porque estaba utilizando el support.v4.app.FragmentManager
lugar del regular fragmentmanager
La mejor opción sería probablemente tener el Fragmento que instancia el RecyclerAdapter para implementar e interfaz como esto:
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 } }
Sé que es demasiado tarde para ti, pero para cualquiera que pueda ver esto.
Así que, en lugar de hacer m vai, puede pasar el contexto del fragmento al inicializar su adaptador.
Así que 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 sólo puede inicializar si así
MyCustomAdapter myAdapter = new MyCustomAdapter(this);
finalmente puedes llamar
Fragment fragment = new myNewFragment(); FragmentManager fragmentManager = context.getFragmentManager(); fragmentManager.beginTransaction().replace(R.id.fragment_container, fragment) .commit();
así que usted puede comenzar un nuevo fragmento
Sólo necesita un contexto de actividad pasado en su constructor. Asegúrese de llamar al nuevo Adapter(this,...)
de las actividades y el new Adapter(getActivity(),...)
de los fragmentos.
private Context context; @Override public void onClick(View v) { FragmentManager manager = ((Activity) context).getFragmentManager();}
Puede pasar la referencia de FragmentManager mientras crea el visor para que su clase para el Visor de cuentas pueda ser la siguiente
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... } }
- ¿Cómo activar programaticamente el evento táctil en android?
- barra de herramientas ocultar androide en fragmento específico