Как открыть фрагмент из RecyclerView.Adapter <CardAdapter.ViewHolder>

1.TabLayout

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

В CardView ClickListner откройте другой фрагмент в tab3. Итак, как открыть фрагмент в tab3.

Ошибка в getFragmentManager() :

 FragmentTransaction transaction = getFragmentManager().beginTransaction(); 

Вместо этого я попытался:

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

Но ошибка не решена.

Вот мой код:

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

Solutions Collecting From Web of "Как открыть фрагмент из RecyclerView.Adapter <CardAdapter.ViewHolder>"

Проблема:

 Error:cannot find symbol method getSupportFragmentManager() 

Решение :

Когда вы используете контекст adapter затем для менеджера фрагментов доступа, вам нужно указать свой context . Поэтому вы должны использовать этот путь.

 YourParentActivity myActivity = (YourParentActivity)context 

Теперь вы можете получить доступ к методу для менеджера фрагментов, например,

 myActivity.getSupportFragmentManager(); 

Но имейте в виду, что ваш Fragment должен быть импортирован как файл android.support.app.v4.Fragment иначе может возникнуть проблема кастинга.

Если вы открываете фрагмент для определенной одной вкладки, вы должны использовать getChildSupportFragmentManager() вместо getSupportFragmentManager()

Примечание. Если вы хотите вызвать fragment из класса adapter вы должны сделать interface и передать слушателю метод нажатия кнопки и реализовать свою деятельность с помощью этого интерфейса.

Обновить :

Также вы можете передать FragmentManager в свой конструктор адаптера. Подобно,

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

И после этого вы можете использовать this.f_manager в своем getView() класса getView() .

Если вы использовали фрагменты библиотеки поддержки или фрагменты по умолчанию, обязательно используйте их каждый раз в каждом месте. И используйте «getSupportFragmentManager» или «getFragmentManager» тщательно.

Пропустить контекст внутри конструктора.

 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); } 

Внутри onClick

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

Обновить

 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); } 

Попробуйте этот снайпер:

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