2016-08-04 17 views
1

Ich habe ein interessantes Problem, ich versuche zu lösen, die Kommunikation zwischen einem Listenansicht-Adapter und einem Fragment. Ich bin ziemlich neu in der Verwendung von Schnittstellen, also bitte bitte mit mir.Schnittstelle zwischen ListAdapter und Fragment

In meiner Liste Ansicht Adapter, ich brauche eine Änderung des Elternfragment auslösen - insbesondere das int Mitglied mediaId:

FragmentTitle extends Fragment implements FragmentManager.OnBackStackChangedListener, 
      MediaListView.OnMediaTitleSelectedListener { 

    private int mediaId; 
    // Other properties, methods, etc 


    // Required interface method implementation 
    @Override 
    public void onMediaTitleSelected(int i) { 
     mediaId = i; 
    } 

} 

Ich habe eine Schnittstelle in der MediaListView Adapterklasse als solche geschrieben:

public interface OnMediaTitleSelectedListener { 
    void onMediaTitleSelected(int i); 
} 

im getView() Methode des Adapters (MediaListView), gibt es eine onClick Methode aufgerufen:

... 
// mediaId instantiated here 
final int itemMediaId = foo.getMediaId(); 

OnMediaTitleSelectedListener callback; 

item.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // I need to "trigger" the event here 
     callback.onMediaTitleSelected(itemMediaId); 

     // Other stuff done here... yadda yadda 
    } 
} 

Nun, ich weiß, ich brauche diese Schnittstelle zu instanziieren, damit einen Nullpointer auslösen, und ich versuchte, so in die MediaListView Klasse zu tun:

OnMediaTitleSelectedListener callback = new OnMediaTitleSelectedListener() { 
    @Override 
    public void onMediaTitleSelected(int i) { 
     Log.i(TAG, "onMediaTitleSelected: "+ i); 
    } 
}; 

Die oben in der Tat protokolliert das geklickt Ergebnis, aber da diese in der Klasse MediaListView ist, wird das Ereignis nicht auf FragmentTitle ausgelöst, obwohl beide nebeneinander im selben Layout sind. Ich verstehe auch nicht, warum das obige notwendig ist, da ich für diese Schnittstellenimplementierung in MediaListView, nur in FragmentTitle keine Verwendung habe.

Der Grund für all dies ist das Bundle outState für Konfigurationsänderungen zu aktualisieren - FragmentTitle, davon MeidaListView ein Kind der letzten mediaId so geklickt aktualisiert werden muss, ist, dass die gleiche Sache nach der Drehung des Bildschirms erscheint.

Gehe ich in die falsche Richtung? Im Augenblick füge ich den Wert zu statischem Mitglied in einer anderen Klasse hinzu, um den Wert von mediaId zu "halten", aber etwas sagt mir, dass dies nicht der "richtige" Weg ist, dies zu tun.

Danke für jede Hilfe!

Antwort

2

Ihre Problem ist, dass Sie das Callback-Objekt erstellen (OnMediaTitleSelectedListener) lokal, obwohl dieses Objekt FragmentTitle sein muss. Da FragmentTitle die Schnittstelle OnMediaTitleSelectedListener implementiert, kann sie als OnMediaTitleSelectedListener-Objekt im Konstruktor des Adapters übergeben werden.Irgendwie wie folgt aus:

public MediaListView(OnMediaTitleSelectedListener omtsl, ...){ 
    callback = omtsl; 
} 

Und wenn Sie den MediaListView Adapter instanziiert, dann sollten Sie das FragmentTitle Objekt wie OnMediaTitleSelectedListener:

FragmentTitle fragmentTitle = new FragmentTitle(...); 
MediaListView mediaListView = new MediaListView(fragmentTitle, ...); 

Auf diese Weise Ihre Callback-Objekt zum FragmentTitle beziehen, und wird nennen seineonMediaTitleSelected() Methode, anstatt die lokale Protokollierungsmethode, wie Sie implementiert.

+1

Vielen Dank für Ihre Eingabe! – mwieczorek

0

Statt dessen

OnMediaTitleSelectedListener callback = new OnMediaTitleSelectedListener() { 
@Override 
public void onMediaTitleSelected(int i) { 
    Log.i(TAG, "onMediaTitleSelected: "+ i); 
} 
}; 

Sie Ihre FragmentTitle als Schnittstelle geben sollte, wenn die MediaListView zu schaffen, wie

MediaListView mListView = new MediaListView(this,....) 

wo Konstruktor MediaListView wäre wie

public MediaListView(OnMediaSelectedListener mListener,....){ 
    this.mListener = mListener 
    ... 
Verwandte Themen