RecyclerView RecyclerViewDataObserver未注册

时间:2016-03-14 19:48:00

标签: android android-recyclerview greenrobot-eventbus

我正在使用RecyclerViewSyncAdaptergreenrobot eventbus 当我的SyncAdapter完成syincing时,我将消息发布到消息总线中:

EventBus.getDefault().post(new EventMessagesRefreshed());

在我的目标课程中,我会执行以下操作:

@Subscribe
public void onEvent(EventMessagesRefreshed event) {
    this.init();
}

在我的init()中,我为recyclerview创建适配器并设置它:

public void init() {
    if(this.listRowParent != null) {
        this.adapter = new FragmentMessagesListAdapter(this.getActivity(), SingletonMessages.getInstance().getMessages());
        this.listRowParent.setAdapter(this.adapter);
    }
}

// listRowParent is my RecyclerView!

接收事件的片段位于选项卡视图的内部。因此,当我不在正确的目标选项卡中时,SyncAdapterEventMessagesRefreshed发布到消息总线中有多个选项卡,有时当然会将init()发布到消息总线中,但是由于它已注册,它会尝试调用RecyclerView并创建适配器并将其设置为Could not dispatch event: class EventMessagesRefreshed to subscribing class class FragmentMessagesList java.lang.IllegalStateException: Observer android.support.v7.widget.RecyclerView$RecyclerViewDataObserver@2c3421a7 was not registered. at android.database.Observable.unregisterObserver(Observable.java:69) at android.support.v7.widget.RecyclerView$Adapter.unregisterAdapterDataObserver(RecyclerView.java:5688) at android.support.v7.widget.RecyclerView.setAdapterInternal(RecyclerView.java:873) at android.support.v7.widget.RecyclerView.setAdapter(RecyclerView.java:857) 。如果发生这种情况,我会收到以下错误:

init()

所以我需要RecyclerView我的适配器和RecyclerViewDataObserver仅在.videowrapper { /* ... */ position: absolute; top: 0; left: 0; z-index: -1; } 注册时才会使用。

我该怎么做?

1 个答案:

答案 0 :(得分:5)

您需要注册数据观察器以侦听来自同步适配器的数据更改。

Collection

RecyclerView.AdapterDataObserver是您调用的通知方法的结果。因此,例如,如果在向适配器添加项目后调用notifyItemInserted(),则会调用onItemRangeInserted()

更详细的例子

.remove(int)
  

适配器可以发布描述特定事件的各种事件   变化。并非所有适配器都支持所有更改类型,有些可能   回归到通用"改变的东西"事件,如果更具体的数据   不可用。