动态更新片段

use*_*519 2 java android fragment

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

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

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

我知道我可能需要使用某种类似的观察者模式:当它扩展另一个类时,如何使一个类扩展Observable? 但是,我仍然不确定如何直接更新片段,以及如何在我的应用程序中应用观察者/事件模式.

kri*_*son 22

由于片段可以很容易地访问活动getActivity(),我会将活动作为调度更新的中心枢纽.

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

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

        public interface DataUpdateListener {
            void onDataUpdate();
        }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 向活动添加数据结构以跟踪侦听器:

        private List<DataUpdateListener> mListeners;
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

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

    public class MyFragment extends Fragment implements DataUpdateListener {
    
    Run Code Online (Sandbox Code Playgroud)

    并实施该方法

        @Override
        public void onDataUpdate() {
            // put your UI update logic here
        }
    
    Run Code Online (Sandbox Code Playgroud)
  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);
        }
    
    Run Code Online (Sandbox Code Playgroud)
  7. 在片段的UI更新事件中触发事件:

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