我正在使用RecyclerView
,SyncAdapter
和greenrobot 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!
接收事件的片段位于选项卡视图的内部。因此,当我不在正确的目标选项卡中时,SyncAdapter
将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
仅在.videowrapper {
/* ... */
position: absolute;
top: 0;
left: 0;
z-index: -1;
}
注册时才会使用。
我该怎么做?
答案 0 :(得分:5)
您需要注册数据观察器以侦听来自同步适配器的数据更改。
Collection
RecyclerView.AdapterDataObserver是您调用的通知方法的结果。因此,例如,如果在向适配器添加项目后调用notifyItemInserted(),则会调用onItemRangeInserted()
更详细的例子
.remove(int)
适配器可以发布描述特定事件的各种事件 变化。并非所有适配器都支持所有更改类型,有些可能 回归到通用"改变的东西"事件,如果更具体的数据 不可用。