Hirdetés

Új hozzászólás Aktív témák

  • Karma

    félisten

    válasz #39560925 #3218 üzenetére

    Azt semmiképp se tartom jó ötletnek, hogy a MainActivity közvetlenül ismerje az ExceptionsFragment példányt. Mivel a ViewPager is virtualizál (azaz a ListViewhoz hasonlóan csak a látható vagy szomszédos viewkat tartja életben), elég kusza helyzetek alakulhatnak ki.

    Hogy ezt hogyan kerüld el, van pár lehetőség.

    Az első a klasszikus jávás Listener minta. Az activityben definiálsz egy Listener interfészt, amit a fragment megvalósít, valamint egy kis ceremóniát, hogy fel lehessen rá iratkozni. A fragment onAttach metódusában regisztrál, onDetachban pedig deregisztrál - ameddig össze van kötve, az activity tud neki jelezni. Mondjuk a konkrét activity osztályt is elfedném akkor már.

    ExceptionChangeListener.java:

    public interface ExceptionChangeListener {
    void onExceptionsChanged();
    }

    ExceptionSource.java:

    public interface ExceptionSource {
    boolean addExceptionChangeListener(ExceptionChangeListener listener);
    boolean removeExceptionChangeListener(ExceptionChangeListener listener);
    }

    MainActivity.java:

    public class MainActivity extends AppCompatActivity implements ExceptionSource {
    private final Set<ExceptionChangeListener> mListeners = new HashSet<ExceptionChangeListener>();

    ...

    public boolean addExceptionChangeListener(ExceptionChangeListener listener) {
    return mListeners.add(listener);
    }

    public boolean removeExceptionChangeListener(ExceptionChangeListener listener) {
    return mListeners.remove(listener);
    }

    ... amikor módosítottad a listát, hívd meg ezt ...

    private void notifyListeners() {
    for (ExceptionChangeListener listener : mListeners) {
    listener.onExceptionsChanged();
    }
    }
    }

    ExceptionsFragment.java:

    public class ExceptionsFragment extends Fragment implements ExceptionChangeListener {
    @Override
    public void onAttach (Activity activity) {
    super.onAttach(activity);
    if (activity instanceof ExceptionSource) {
    ((ExceptionSource)activity).addExceptionChangeListener(this);
    }
    }

    @Override
    public void onDetach() {
    if (getActivity() instanceof ExceptionSource) {
    ((ExceptionSource)getActivity()).removeExceptionChangeListener(this);
    }

    super.onDetach();
    }

    @Override
    public void onExceptionsChanged() {
    adapter.notifyDataSetChanged();
    }
    }

    Huh, ez elég hosszú lett. A másik kettőbe inkább nem megyek bele így nyilvánosan kód szinten.

    A második az lenne, hogy a fragmented onAttach/onDetach időben egy BroadcastReceivert indít el, az activity pedig Intenteket dobál, ha változás van. Ez lehet közvetlenül a sendBroadcast metódussal, vagy LocalBroadcastManagerrel. Lazább csatolás, de elég sok ceremónia.

    A harmadik pedig egy event bus bevezetése (pl. Otto), ahol a logika ugyanaz mint a másodikban, csak kevesebb extra kód (eltekintve a lib dependenciától). Én így 2015-ben egyébként ezt az utat javaslom.

Új hozzászólás Aktív témák