Wie rufe ich getFragmentManager auf Recycler.Adapter auf?

Lesezeit: 4 Minuten

Ich konvertiere ListView meiner App in RecyclerView. In ListView war es sehr einfach, OnClickListener zu implementieren, aber in RecyclerView müssen wir es im Adapter tun. Ich möchte ein neues Fragment öffnen, wenn der Benutzer auf ein Element klickt. Dazu muss ich FragmentManager im Adapter aufrufen, was ich nicht kann. Dies ist mein Code von RecyclerAdapter:

public ListItemViewHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.title);
            description = (TextView) itemView.findViewById(R.id.description);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            //Call FragmentManager and add Fragment to it.
            }
        }

Also, wie man FragmentManager aufruft und Fragmente darin hinzufügt. Gibt es einen besseren Weg als das Senden von Broadcast oder eine andere Methode.

  • bubble event bis zu Recycler.Adapter (wie es sich jetzt im Halter befindet) und einen Listener dafür setzen (zum Beispiel das Fragment, das den Addapter erstellt) – wie geht das? es wurde hier so oft beschrieben

    – Selvin

    16. Juni 2015 um 12:01 Uhr


  • @Selvin Ich weiß, wie man FragmentManager in Aktivität oder Fragment aufruft, aber es gibt mir einen Fehler in Adapter

    – Irgendein Entwicklername

    16. Juni 2015 um 12:20 Uhr

Benutzeravatar von natario
natürlich

Sie brauchen nur einen Aktivitätskontext, der in Ihrem Konstruktor übergeben wird. Unbedingt anrufen new Adapter(this,...) aus Aktivitäten u new Adapter(getActivity(),...) aus Fragmenten.

private Context context;

@Override
public void onClick(View v) {
    FragmentManager manager = ((AppCompatActivity)context).getSupportFragmentManager();
}

  • FragmentManager-Manager = ((AppCompatActivity)context).getSupportFragmentManager();

    – Codelabor

    10. Juli 2018 um 14:07 Uhr

Benutzeravatar von Isaac Martin Otim
Isaac Martin Otim

Um die genehmigte Antwort zu ergänzen: Wenn Sie immer noch einen Fehler erhalten, müssen Sie diese Zeile möglicherweise ersetzen.

FragmentManager manager = ((Activity)context).getFragmentManager();

Mit diesem

FragmentManager manager = ((AppCompatActivity)context).getSupportFragmentManager();

Bei mir lag das daran, dass ich die benutzte support.v4.app.FragmentManager statt normal fragmentmanager

Erhalten Sie immer noch einen Fehler?

Wie ein Kommentar unten betonte, könnte dies einen auslösen java.lang.ClassCastException: und protokollieren ... cannot be cast to android.support.v7.app.AppCompatActivity (siehe Kommentare für Details)

Ihre Lösung bestand darin, stattdessen dies zu verwenden (ich habe es nicht getestet, aber es hat für sie funktioniert):

((AppCompatActivity)activity).getSupportFragmentManager()

  • Ich hatte das gleiche Problem. Vielen Dank 🙂

    – h8pathak

    11. Juli 2016 um 7:40 Uhr

  • @h8pathak froh, dass es geholfen hat

    – Isaac Martin Otim

    18. Juli 2016 um 12:43 Uhr

  • Danke dir! Das hilft mir.

    – Polar

    17. November 2016 um 12:21 Uhr

  • java.lang.ClassCastException: com.skypoint.cmdroyal.extra.AppControllerVolley kann nicht in android.support.v7.app.AppCompatActivity umgewandelt werden Ich habe dieses Problem. Ich versuche, dies über Recycler-Elemente zu öffnen. Diese Codezeile befindet sich also in einer Adapterklasse.

    – Debasish Ghosh

    29. August 2017 um 7:44 Uhr

  • das hat funktioniert. ((AppCompatActivity)Aktivität).getSupportFragmentManager()

    – Debasish Ghosh

    29. August 2017 um 7:50 Uhr

Stellen Sie sicher, dass Sie den Kontext an den ArrayAdapter oder RecyclerViewAdpater übergeben, damit wir ihn in die Adapterklasse bekommen können.

Wenn Ihre Hauptaktivität die Aktivität erweitert, verwenden Sie:

 FragmentManager fragmentManager = ((Activity)context).getFragmentManager();

Wenn Ihre mainActivity AppCompatActivity erweitert, verwenden Sie:

FragmentManager fragmentManager = ((AppCompatActivity)context).getSupportFragmentManager();

Die beste Option wäre wahrscheinlich, das Fragment, das den RecyclerAdapter instanziiert, zu implementieren und wie folgt zu verbinden:

public class MyRecyclerAdapter extends Adapter<RecyclerAdapter.ViewHolder> {

     private ItemType[] mItems;
     private MRAItemClickedListener mListener;

     public MyRecyclerAdapter(Context ctx, MRAItemClickedListener listener){

        mListener = listener;
        ...
     }

     @Override
     public void onBindViewHolder(ViewHolder holder, int position) {
         holder.itemView.setOnClickListener(new OnClickListener(){
             @Override
             public void onClick(View v) {
                  mListener.onItemClicked(mItems[position]);
             }
         });
     }

     interface MRAItemClickedListener {
         void onItemClicked(ItemType item);
     }

}

public class MyFragment ... implements MRAItemClickedListener {

    public void onItemClicked(ItemType item){
          // do stuff with item
    }

}

Sie brauchen nur einen Aktivitätskontext, der in Ihrem Konstruktor übergeben wird. Unbedingt neu anrufen Adapter(this,...) aus Aktivitäten u new Adapter(getActivity(),...) aus Fragmenten.

private Context context;
@Override
public void onClick(View v) {
FragmentManager manager = ((Activity) context).getFragmentManager();}

Benutzeravatar von ali mikaeili
ali mikaeili

In Kotlin können Sie diesen Code verwenden:

    val fm : FragmentManager= (context as AppCompatActivity).supportFragmentManager

Benutzeravatar von maxib7
maxib7

Ich weiß, das ist zu spät für dich, aber für alle anderen, die das sehen könnten.

Anstatt also m vai did zu tun, können Sie den Kontext des Fragments übergeben, wenn Sie Ihren Adapter zum ersten Mal initialisieren.

In Ihrem Konstruktor für Ihren Adapter können Sie also ein Argument wie dieses hinzufügen

 // variable to hold fragment
 private Fragment fragment;

 public MyCustomAdapter(Fragment fragment)
 {
    this.fragment = fragment;
 }

und in Ihrem Fragment können Sie es einfach so initialisieren

 MyCustomAdapter myAdapter = new MyCustomAdapter(this);

Endlich kann man anrufen

Fragment fragment = new myNewFragment();
FragmentManager fragmentManager = context.getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.fragment_container, fragment)
.commit();

damit Sie ein neues Fragment beginnen können

1438720cookie-checkWie rufe ich getFragmentManager auf Recycler.Adapter auf?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy