Android 未注册RecyclerView RecyclerViewDataObserver

Android 未注册RecyclerView RecyclerViewDataObserver,android,android-recyclerview,greenrobot-eventbus,Android,Android Recyclerview,Greenrobot Eventbus,我正在使用RecyclerView,SyncAdapter和 当我的SyncAdapter完成同步后,我将一条消息发布到消息总线中: EventBus.getDefault().post(new EventMessagesRefreshed()); 在我的目标课程中,我做了以下工作: @Subscribe public void onEvent(EventMessagesRefreshed event) { this.init(); } 在我的init()中,我为recyclervi

我正在使用
RecyclerView
SyncAdapter
和 当我的
SyncAdapter
完成同步后,我将一条消息发布到消息总线中:

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!
接收事件的片段位于选项卡视图的内部。因此有多个选项卡,有时当然,
SyncAdapter
会在im不在正确的目标选项卡中时将
EventMessagesRefreshed
发布到消息总线中,但由于它已注册,它会尝试调用
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
时才需要


我该怎么做呢?

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

mrecycleServiceAdapter.registerAdapterDataObserver(myObserver)

RecyclerView.AdapterDataObserver是调用notify方法的结果。例如,如果在向适配器添加项后调用notifyItemInserted(),则会调用OnItemRangeSerted()

更详细的例子

protected void setupRecyclerView() {
    mAdapter = new MyAdapter(mItemList);
    mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        @Override
        public void onChanged() {
            super.onChanged();
            checkAdapterIsEmpty();
        }
    });

    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mRecyclerView.setHasFixedSize(true);

    mRecyclerView.setAdapter(mAdapter);
    checkAdapterIsEmpty();
}`
适配器可以发布描述特定事件的各种事件 变化。并非所有适配器都支持所有更改类型,有些适配器可能支持所有更改类型 如果有更具体的数据,则返回到一般的“发生了变化”事件 没有


我们应该在使用后注销吗?是的,你应该@crgarridos如何注销,你发布的链接并不能回答这个问题