我在活動上添加了三個列表片段。在其他列表片段/選項卡上調用notifyDataSetChanged()
- 聯繫人列表片段
- 任務列表片段
- 書籤列表片段
用戶可以在TAB1和TAB2書籤項目,然後它顯示在標籤選項/片段。
我想知道,而在Tab1或Tab2書籤,如何調用notifyDataSetChanged()書籤片段刷新列表視圖。
我可以得到listAdapter與其他列表片段相關聯來刷新listview項目。
謝謝。
我在活動上添加了三個列表片段。在其他列表片段/選項卡上調用notifyDataSetChanged()
用戶可以在TAB1和TAB2書籤項目,然後它顯示在標籤選項/片段。
我想知道,而在Tab1或Tab2書籤,如何調用notifyDataSetChanged()書籤片段刷新列表視圖。
我可以得到listAdapter與其他列表片段相關聯來刷新listview項目。
謝謝。
有辦法做到這一點
方法1:
你在你的ViewPager
活動實施ViewPager.OnPageChangeListener
和
@Override
public void onPageSelected(int position) {
// get the instance of the listview from the fragment and refresh it.
}
刷新列表視圖。
而一個可取的方法
方式2:
使用EventBus
link.
compile 'de.greenrobot:eventbus:2.4.0'
只有你有post
和register
數據。它會做所有的事情。
發送者或接收者可能是Activity
,Fragment
或任何Background threads
。
你需要一個觀察者模式。 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];
}
}所有的
首先感謝您對這種解釋的例子。我已經實現了Observer模式。它工作正常,但是當我嘗試用Toast消息或notifyDataSetChanged()更新UI(在Observer更新方法中)時;它會拋出錯誤。看來更新方法在UI上不起作用。 –
是的。在這種情況下的例外是關於只創建UI並改變自己的原始線程。您可以通過下面的代碼片段解決此問題: runOnUiThread(新的Runnable(){ 公共無效的run(){// 通知UI } }); –
我已更新答案。看看這是否適合你。 –