web-dev-qa-db-de.com

Wie Fragment aus RecyclerView.Adapter <CardAdapter.ViewHolder> öffnen

1.TabLayout

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

Auf CardView ClickListner öffnen Sie ein anderes Fragment in tab3. So öffnen Sie Fragment in tab3.

Fehler ist in getFragmentManager():

FragmentTransaction transaction = getFragmentManager().beginTransaction();

Stattdessen habe ich versucht:

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

Aber der Fehler ist nicht zu beheben.

Hier ist mein Code:

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

            }
    });

        }
    }
}
20

Öffne ein neues Fragment wie folgt in deinem Klick

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


        }
23

Problem:

Error:cannot find symbol method getSupportFragmentManager() 

Lösung:

Wenn Sie den Kontext adapter verwenden, müssen Sie für den Zugriff auf den Fragment-Manager context umwandeln. Also solltest du diesen Weg nutzen.

YourParentActivity myActivity = (YourParentActivity)context

Jetzt können Sie auf die Methode für den Fragment-Manager zugreifen, z.

myActivity.getSupportFragmentManager();

Denken Sie jedoch daran, dass Ihr Fragment als Android.support.app.v4.Fragment Importiert werden sollte, da sonst möglicherweise ein Casting-Problem auftritt.

Wenn Sie ein Fragment für eine bestimmte Registerkarte öffnen, sollten Sie getChildSupportFragmentManager() anstelle von getSupportFragmentManager() verwenden.

Hinweis: Wenn Sie fragment aus adapter aufrufen möchten, sollten Sie interface erstellen und den Listener an Ihre Button-Click-Methode übergeben und Ihre Aktivität implementieren mit dieser Schnittstelle.

pdate:

Sie können auch FragmentManager an Ihren Adapterkonstruktor übergeben. Mögen,

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

Danach können Sie this.f_manager In Ihrer Adapterklasse getView() verwenden.

15
Piyush

Wenn Sie Fragmente der Unterstützungsbibliothek oder Standardfragmente verwendet haben, stellen Sie sicher, dass Sie diese überall gleich verwenden. Verwenden Sie "getSupportFragmentManager" oder "getFragmentManager" vorsichtig.

Übergeben Sie den Kontext in den Konstruktor.

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

Innerhalb von onClick

....Your Code

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

...Your Code

Aktualisieren

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

Versuchen Sie dies geschnappt:

ShareFragment newFragment = new ShareFragment();
itemView.getContext().getFragmentManager().beginTransaction()
.replace(R.id.viewFragments, newFragment)
.addToBackStack(null)
.commit();
0
Skizo-ozᴉʞS