在其他列表片段/选项卡上调用notifyDataSetChanged()

时间:2015-08-08 11:45:54

标签: android android-listfragment notifydatasetchanged

我在活动中添加了三个列表片段。

  1. 联系人列表片段
  2. 任务列表片段
  3. 书签列表片段
  4. 用户可以在Tab1和Tab2上为项目添加书签,然后在书签标签/片段中显示。

    我想知道,当在Tab1或Tab2上添加书签时,如何调用bookmarks片段的notifyDataSetChanged()来刷新listview。

    我是否可以获得与其他列表片段关联的listAdapter来刷新listview项目。

    感谢。

2 个答案:

答案 0 :(得分:0)

有很多方法可以实现这个目标

方式1:

您必须在ViewPager.OnPageChangeListener

的活动中实施ViewPager
@Override
public void onPageSelected(int position) {
    // get the instance of the listview from the fragment and refresh it.
}    

刷新listview。

更好的方式

方式2:

使用EventBus link.

compile 'de.greenrobot:eventbus:2.4.0'

只有您需要postregister数据。它会做所有的事情。

发件人或收件人可能是ActivityFragment或任何Background threads

答案 1 :(得分:0)

你需要一个观察者模式。 Tab1和tab2将广播一条消息,Bookmark标签/片段将收听该消息并相应地通知

从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

public interface 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];
}

}