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()
.