studio recyclerview item example ejemplo custom cardview android android-fragments android-recyclerview android-viewholder

android - item - recyclerview gradle



Cómo abrir el fragmento desde RecyclerView.Adapter<CardAdapter.ViewHolder> (4)

Abra el nuevo fragmento como sigue en su onclick

@Override public void onClick(View view){ AppCompatActivity activity = (AppCompatActivity) view.getContext(); Fragment myFragment = new MyFragment(); activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment).addToBackStack(null).commit(); }

1.TabLayout

- tab1 (Fragment1) - tab2 (Fragment2) - tab3 (Fragment3) * RecyclerView + CardView (OnClick)

En CardView ClickListner abra otro fragmento en la pestaña 3. Entonces, ¿cómo abrir el fragmento en tab3.

El error está en getFragmentManager() :

FragmentTransaction transaction = getFragmentManager().beginTransaction();

En lugar de esto, intenté:

FragmentTransaction transaction = activity.getFragmentManager().beginTransaction(); FragmentTransaction transaction = itemview.getContext().getFragmentManager().beginTransaction();

Pero el error no se resuelve.

Aquí está mi código:

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> { List<NatureItem> mItems; private int lastPosition = -1; Context context; TaskFragment main; public CardAdapter(Context context,TaskFragment ma) { this.context=context; main=ma; } public CardAdapter() { super(); mItems = new ArrayList<NatureItem>(); NatureItem nature = new NatureItem(); nature.setName("The Paris Attack 2015"); nature.setDes("Lorem ipsum dolor sit amet."); nature.setThumbnail(R.drawable.news1); mItems.add(nature); } @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) { View v = LayoutInflater.from(viewGroup.getContext()) .inflate(R.layout.custom_list, viewGroup, false); ViewHolder viewHolder = new ViewHolder(v); return viewHolder; } @Override public void onBindViewHolder(ViewHolder viewHolder, int i) { NatureItem nature = mItems.get(i); viewHolder.tvNature.setText(nature.getName()); viewHolder.tvDesNature.setText(nature.getDes()); viewHolder.imgThumbnail.setImageResource(nature.getThumbnail()); // setAnimation(viewHolder.card,i); } @Override public int getItemCount() { return mItems.size(); } class ViewHolder extends RecyclerView.ViewHolder { private int lastPosition = -1; public ImageView imgThumbnail; public TextView tvNature; public TextView tvDesNature; // Button btnclear,btncancle; CardView card; Activity activity; Context co; public ViewHolder(final View itemView) { super(itemView); imgThumbnail = (ImageView) itemView.findViewById(R.id.img_thumbnail); tvNature = (TextView) itemView.findViewById(R.id.tv_nature); tvDesNature = (TextView) itemView.findViewById(R.id.tv_des_nature); card = (CardView) itemView.findViewById(R.id.card); card.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(itemView.getContext(), "Clicked Card...", Toast.LENGTH_LONG).show(); ShareFragment newFragment = new ShareFragment(); FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.replace(R.id.viewFragments, newFragment); transaction.addToBackStack(null); transaction.commit(); } }); } } }


Prueba este sniped:

ShareFragment newFragment = new ShareFragment(); itemView.getContext().getFragmentManager().beginTransaction() .replace(R.id.viewFragments, newFragment) .addToBackStack(null) .commit();


Si ha usado fragmentos de biblioteca de soporte o fragmentos predeterminados, asegúrese de usar el mismo en todas partes. Y use "getSupportFragmentManager" o "getFragmentManager" con cuidado.

Pasa el contexto dentro del constructor.

public CardAdapter(Context context) { super(); mItems = new ArrayList<NatureItem>(); NatureItem nature = new NatureItem(); nature.setName("The Paris Attack 2015"); nature.setDes("Lorem ipsum dolor sit amet."); nature.setThumbnail(R.drawable.news1); mItems.add(nature); }

Dentro de clic

....Your Code ShareFragment newFragment = new ShareFragment(); FragmentTransaction transaction = /* Here is the change.*/context.getFragmentManager().beginTransaction(); transaction.replace(R.id.viewFragments, newFragment); ...Your Code

Actualizar

Inside onClick call mainActivity setFragment method to replace fragment. ((MainActivity) context).setFragment(yourFragment); public void setFragment(Fragment frag){ FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.replace(R.id.viewFragments, frag); }


Problema

Error:cannot find symbol method getSupportFragmentManager()

Solución:

Cuando usa el contexto del adapter entonces para acceder al administrador de fragmentos, necesita convertir su context . Así que deberías usarlo de esta manera.

YourParentActivity myActivity = (YourParentActivity)context

Ahora puedes acceder al método para el administrador de fragmentos como,

myActivity.getSupportFragmentManager();

Pero tenga en cuenta que su Fragment debería importarse como android.support.app.v4.Fragment contrario podría haber un problema de conversión.

Si abre el fragmento para una pestaña en particular, debe usar getChildSupportFragmentManager() lugar de getSupportFragmentManager()

Nota: Si desea llamar a fragment de la clase de adapter , debe crear una interface y pasar la escucha a su método de clic de botón e implementar su actividad con esa interfaz.

Actualización:

También puede pasar FragmentManager a su constructor de adaptador. Me gusta,

public FragmentManager f_manager; public CardAdapter(Context context,TaskFragment ma , FragmentManager f_manager) { this.context = context; this.f_manager = f_manager; main=ma; }

Y después de eso, puede usar this.f_manager en su clase de adaptador método getView() .