10

Ich habe eine Fragment mit einer ListView. Im Adapter möchte ich einen Dialog erstellen.Aktivitätskontext in einem Adapter von einem Fragment abrufen

class ViewHolder { 
... 
    @Override 
    public void onClick(View v) { 
    ... 
    AlertDialog.Builder builder = new AlertDialog.Builder(mContext); 
    ... 
    } 
... 
} 

mContext ist die Context von meinem Fragment, die ich global speichern, wenn der Adapter erstellt wird. Ich bekomme den Fehler.

unable to add window -- token null is not for an application

Verfahren getActivity() ist nicht verfügbar, so wie die Context meiner Activity zu bekommen?

+3

Post mehr Code. – Blackbelt

+0

'View.getContext()'? ... wie auch immer: 'was ich global speicher, wenn der Adapter erstellt wird? Speichern Sie Context (was nicht Application ist) irgendwo als global (FSM save us)? – Selvin

+0

Ich speichere den Kontext in einem globalen Variablen in meinem Adapter, sollte die Fsm mich retten? (ist fsm das fliegende spagetthi Monster?) – AdrianoCelentano

Antwort

14

Wenn Sie Ihren Adapter erstellen, was geben Sie als Kontext weiter? Versuchen Sie, this zu passieren, wenn Sie es nicht tun. Etwas mehr Code wäre auch hilfreich.

+0

ah Scheiße ich habe diesen Teil nicht codiert, der Fehler war der Kontext, den ich aus dem Fragment bekomme, ist ApplicationContext und nicht Aktivität Kontext, sry hat das nicht erwartet – AdrianoCelentano

25

Wenn Sie einen benutzerdefinierten Adapter haben, ändern Sie den Konstruktor so, dass Context als Parameter erforderlich ist.

public CustomAdapter(Context context, List<Item> items) { 
} 

Erstellen Sie dann eine Instanzvariable, um den Kontext über den Konstruktor zu speichern.

private Context mContext; //instance variable 

public CustomAdapter(Context context, List<Item> items) { 
    //some code 
    this.mContext= context; 
} 

Und nun können Sie die Variable mContext überall in Ihrem Adapter.

Um den Adapter zu erstellen, geben Sie einfach 'this' ein, wenn er aus einer Aktivität erstellt wurde, oder getActivity(), wenn er aus einem Fragment erstellt wurde.

mAdapter = new CustomAdapter(this, mArrayItems); 

Hoffe, dass hilft.

+0

danke, war auch das Recht Richtung – AdrianoCelentano

Verwandte Themen