我正在使用 RecyclerView、SyncAdapter 和 greenrobot eventbus
当我的 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!
接收事件的 fragment 位于选项卡 View 的内部。所以有多个选项卡,有时 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 被注册时。
我该怎么做?
最佳答案
需要注册Data observer来监听sync adapter的数据变化。
mRecyclerViewAdapter.registerAdapterDataObserver(myObserver);
RecyclerView.AdapterDataObserver 是您调用通知方法的结果。因此,例如,如果您在将项目添加到适配器后调用 notifyItemInserted(),则将调用 onItemRangeInserted()
更详细的例子
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();
}`
The adapter may publish a variety of events describing specific changes. Not all adapters may support all change types and some may fall back to a generic "something changed" event if more specific data is not available.
关于android - RecyclerView RecyclerViewDataObserver 未注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35996703/