2016-06-11 81 views
2

我基本上有一個具有多個選項卡的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

實現您的片段的界面和接口設置裏面的數據onclick方法 – SaravInfern

+0

你應該使用事件總線.. https:// github。com/greenrobot/EventBus –

回答

17

由於片段可以很容易地通過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(); 
        } 
    
+0

我已經在上面添加了你的步驟,onDataUpdate()在點擊按鈕時被調用。但我仍然不確定如何在第5步中直接更新片段「//將您的UI更新邏輯放在這裏」。我嘗試附加/分離片段,然後提交更改,但仍然沒有運氣。 – user2097519

+1

你不需要改變片段; 'ViewPager'和'PagerAdapter'處理所有這些。 UI更新邏輯可能只是重新查詢數據庫以獲取其他片段中已更改的內容並在適配器上調用「notifyDataSetChanged」。即使當前顯示的片段左側和右側的片段不可見,您仍然可以看到「ViewPager」,它們仍然處於內存中並處於活動狀態。他們將獲得從可見片段中觸發的事件。當事件被觸發時更新片段,然後當您滑回片段時,它將同步。 –

+0

非常好,清楚的答案。 – ch3tanz