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
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.
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):
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:
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.
val fm : FragmentManager= (context as AppCompatActivity).supportFragmentManager
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
14387200cookie-checkWie rufe ich getFragmentManager auf Recycler.Adapter auf?yes
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