Подтвердить что ты не робот

Как открыть фрагмент из 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();

            }
    });

        }
    }
}
4b9b3361

Ответ 1

Проблема:

Error:cannot find symbol method getSupportFragmentManager() 

Решение:

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

YourParentActivity myActivity = (YourParentActivity)context

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

myActivity.getSupportFragmentManager();

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

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

Примечание.. Если вы хотите вызвать Fragment из adapter class, тогда вы должны сделать 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().

Ответ 2

Если вы использовали фрагменты библиотеки поддержки или фрагменты по умолчанию, обязательно используйте их каждый раз в каждом месте. И используйте "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

Update

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

Ответ 3

Откройте новый фрагмент следующим образом в вашем 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();


        }

Ответ 4

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

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