动态更新片段

时间:2016-06-11 03:51:35

标签: java android fragment

我基本上有一个MainActivity,它有多个标签。每个选项卡都是一个ShowListFragment,它扩展了Fragment。现在,每个选项卡都包含我从数据库中获取的数据。我有一个MOVE按钮,可以在每个片段中将数据从一个选项卡移动到另一个选项卡:

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

片段不会直接更新,但在选项卡之间进行了几次滑动(确切地说是3)。单击按钮后,如何强制片段立即更新?我不想通过ViewPager中的onPageSelected来管理它,因为它不会更新当前打开的片段,但是在我刷新到下一个片段之后。而且我也不想在每次刷卡后更新数据。

我知道我可能需要使用某种观察者模式:How do I make a Class extend Observable when it has extended another class too? 但是,我仍然不确定如何直接更新片段,以及如何在我的应用程序中应用观察者/事件模式。

1 个答案:

答案 0 :(得分:21)

由于片段可以使用getActivity()轻松访问活动,因此我会将活动作为调度更新的中心枢纽。

听起来您已经使用数据库处理了持久性部分,您只需要一些更新事件。所以这里:

  1. 定义侦听器接口。我通常将此作为活动中的内部接口:

        public interface DataUpdateListener {
            void onDataUpdate();
        }
    
  2. 向您的活动添加数据结构以跟踪听众:

        private List<DataUpdateListener> mListeners;
    

    不要忘记在构造函数中初始化:

            mListeners = new ArrayList<>();
    
  3. 将注册/取消注册方法添加到活动:

        public synchronized void registerDataUpdateListener(DataUpdateListener listener) {
            mListeners.add(listener);
        }
    
        public synchronized void unregisterDataUpdateListener(DataUpdateListener listener) {
            mListeners.remove(listener);
        }
    
  4. 将事件方法添加到您的活动中:

        public synchronized void dataUpdated() {
            for (DataUpdateListener listener : mListeners) {
                listener.onDataUpdate();
            }
        }
    
  5. 让您的片段实现DataUpdateListener:

    public class MyFragment extends Fragment implements DataUpdateListener {
    

    并实施方法

        @Override
        public void onDataUpdate() {
            // put your UI update logic here
        }
    
  6. 覆盖片段中的onAttach()onDestroy()以注册/取消注册:

        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            ((MainActivity) activity).registerDataUpdateListener(this);
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            ((MainActivity) getActivity()).unregisterDataUpdateListener(this);
        }
    
  7. 在片段的UI更新事件中触发事件:

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