2015-08-08 57 views
0

我在活動上添加了三個列表片段。在其他列表片段/選項卡上調用notifyDataSetChanged()

  1. 聯繫人列表片段
  2. 任務列表片段
  3. 書籤列表片段

用戶可以在TAB1和TAB2書籤項目,然後它顯示在標籤選項/片段。

我想知道,而在Tab1或Tab2書籤,如何調用notifyDataSetChanged()書籤片段刷新列表視圖。

我可以得到listAdapter與其他列表片段相關聯來刷新listview項目。

謝謝。

回答

0

有辦法做到這一點

方法1:

你在你的ViewPager活動實施ViewPager.OnPageChangeListener

@Override 
public void onPageSelected(int position) { 
    // get the instance of the listview from the fragment and refresh it. 
}  

刷新列表視圖。

而一個可取的方法

方式2:

使用EventBuslink.

compile 'de.greenrobot:eventbus:2.4.0'

只有你有postregister數據。它會做所有的事情。

發送者或接收者可能是ActivityFragment或任何Background threads

0

你需要一個觀察者模式。 TAB1和TAB2將廣播消息和書籤選項卡/片段會聽到該消息,並從TAB1和TAB2相應地通知

則可以通過觸發廣播消息:

EventsListeners.getInstance().broadCastEvent(ListenerCategory.CATEGORY_BOOKMARK, ChangeEvents.EVENT_UPDATE, null); 

在書籤選項卡/片段可以實現接口「EventObserver」和覆蓋的方法「broadCastEvent」

@Override 
public void broadCastEvent(ListenerCategory tabType, ChangeEvents event, Bundle data) { 
    if (tabType == ListenerCategory.CATEGORY_BOOKMARK) { 
     if (event == ChangeEvents.EVENT_UPDATE) { 
       runOnUiThread(new Runnable() { 
        public void run() { 
         // call notify datasetChanged 
        } 
       }); 
     } 
    } 
} 

您還可以在同一個活動或片段來註冊監聽器:

public void registerListeners() { 
    EventsListeners.getInstance().registerListeners(this, ListenerCategory.LISTENER_BOOKMARK); 
} 

public void unRegisterListeners() { 
    EventsListeners.getInstance().unRegisterListener(this, ListenerCategory.CATEGORY_BOOKMARK); 
} 

ChangeEvents。的java

public enum ChangeEvents { 
EVENT_UPDATE; 

}

EventObserver.java

公共接口EventObserver {

public void broadCastEvent(ListinerCategory tabType, ChangeEvents event, Bundle data); 

}

EventListeners.java

public class EventsListeners { 

private static EventsListeners commonListeners = null; 
private EventListener[] listenersArry = null; 

private EventsListeners() { 
    this.listenersArry = new EventListener[ListinerCategory.values().length]; 
    for (int i = 0; i < this.listenersArry.length; i++) { 
     this.listenersArry[i] = new EventListener(); 
    } 
} 

public static EventsListeners getInstance() { 
    if (EventsListeners.commonListeners == null) { 
     EventsListeners.commonListeners = new EventsListeners(); 
    } 
    return EventsListeners.commonListeners; 
} 

public void registerListeners(EventObserver listener, ListinerCategory type) { 
    this.listenersArry[type.ordinal()].registerListener(listener); 
} 

public boolean contain(EventObserver listener, ListinerCategory type) { 
    return this.listenersArry[type.ordinal()].contain(listener); 
} 

public void replaceRegister(EventObserver listener, ListinerCategory type) { 
    this.listenersArry[type.ordinal()].replaceRegister(listener); 
} 

public void unRegisterListener(EventObserver listener, ListinerCategory type) { 
    this.listenersArry[type.ordinal()].unRegisterListener(listener); 
} 

public void unRegisterAllListener(ListinerCategory type) { 
    this.listenersArry[type.ordinal()].unRegisterAllListener(); 
} 

public void broadCastEvent(ListinerCategory type, ChangeEvents event) { 
    this.listenersArry[type.ordinal()].broadCastEvent(type, event); 
} 

public void broadCastEvent(ListinerCategory type, ChangeEvents event, Bundle data) { 
    this.listenersArry[type.ordinal()].broadCastEvent(type, event, data); 
} 

public void destroyObject() { 
    for (final EventListener element : this.listenersArry) { 
     element.destoryObject(); 
    } 
    this.listenersArry = null; 
    EventsListeners.commonListeners = null; 
} 

}

ListenerCategory.java

public enum ListinerCategory { 

CATEGORY_BOOKMARK; 

public static ListinerCategory get(int index) { 
    return ListinerCategory.values()[index]; 
} 

}所有的

+0

首先感謝您對這種解釋的例子。我已經實現了Observer模式。它工作正常,但是當我嘗試用Toast消息或notifyDataSetChanged()更新UI(在Observer更新方法中)時;它會拋出錯誤。看來更新方法在UI上不起作用。 –

+0

是的。在這種情況下的例外是關於只創建UI並改變自己的原始線程。您可以通過下面的代碼片段解決此問題: runOnUiThread(新的Runnable(){ 公共無效的run(){// 通知UI } }); –

+0

我已更新答案。看看這是否適合你。 –

相關問題