Dynamically updating a fragment

2019-01-18 16:56发布

I basically have a MainActivity that has multiple tabs. Each tab is a ShowListFragment and it extends Fragment. Now, each tab contains data that I fetch from a database. I have a MOVE-button that moves data from one tab to another in each Fragment:

@Override
public void onClick(DialogInterface dialog, int listIndex) {
    database.add(listIndex,object);
    database.remove(listIndex,object);
}

The fragment does not update directly, but after a few swipes in between the tabs (3 exactly). How do I force the Fragment to update instantaneous after I clicked the button? I don't want to manage it through onPageSelected in the ViewPager, since it does not update the fragment I'm currently on, but after I've swiped to the next fragment. And also I don't want to update the data after each swipe.

I know that I maybe need to use some kind of observer pattern like this: How do I make a Class extend Observable when it has extended another class too? But still, I'm still not sure how to update the fragment directly, and how to apply the observer/event pattern in my application.

1条回答
仙女界的扛把子
2楼-- · 2019-01-18 17:23

Since the fragments can access the activity easily enough with getActivity(), I would make the activity be the central hub for dispatching updates.

It sounds like you already have the persistence part handled with the database and all you need is some update events. So here goes:

  1. Define a listener interface. I usually do this as an inner interface within the activity:

        public interface DataUpdateListener {
            void onDataUpdate();
        }
    
  2. Add a data structure to your activity to keep track of listeners:

        private List<DataUpdateListener> mListeners;
    

    Don't forget to initialize in the constructor:

            mListeners = new ArrayList<>();
    
  3. Add the register/unregister methods to the activity:

        public synchronized void registerDataUpdateListener(DataUpdateListener listener) {
            mListeners.add(listener);
        }
    
        public synchronized void unregisterDataUpdateListener(DataUpdateListener listener) {
            mListeners.remove(listener);
        }
    
  4. Add the event method to your activity:

        public synchronized void dataUpdated() {
            for (DataUpdateListener listener : mListeners) {
                listener.onDataUpdate();
            }
        }
    
  5. Have your fragments implement DataUpdateListener:

    public class MyFragment extends Fragment implements DataUpdateListener {
    

    and implement the method

        @Override
        public void onDataUpdate() {
            // put your UI update logic here
        }
    
  6. Override onAttach() and onDestroy() in the fragments to register/unregister:

        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            ((MainActivity) activity).registerDataUpdateListener(this);
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            ((MainActivity) getActivity()).unregisterDataUpdateListener(this);
        }
    
  7. Fire the event in your fragment's UI update event:

        @Override
        public void onClick(DialogInterface dialog, int listIndex) {
            database.add(listIndex,object);
            database.remove(listIndex,object);
            ((MainActivity) getActivity()).dataUpdated();
        }
    
查看更多
登录 后发表回答