我和RecyclerView
、SyncAdapter
和绿色机器人事件总线一起工作,当SyncAdapter
完成时,我在消息总线中发布了一条消息:
EventBus.getDefault().post(new EventMessagesRefreshed());
在我的目标类中,我做了以下工作:
@Subscribe
public void onEvent(EventMessagesRefreshed event) {
this.init();
}
在我的init()
中,我为回收视图创建了适配器,并将其设置为:
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!
接收事件的片段位于选项卡视图的内部。所以有多个选项卡,当然,当im不在正确的目标选项卡中时,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
。
,我该怎么做?
发布于 2016-03-14 20:31:54
您需要注册数据观察者来监听来自同步适配器的数据更改。
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();
}`
适配器可以发布描述特定更改的各种事件。并不是所有的适配器都支持所有的更改类型,如果没有更具体的数据,一些适配器可能会退回到一般的“更改”事件。
https://stackoverflow.com/questions/35996703
复制相似问题