Mul*_*ard 6 android greenrobot-eventbus android-recyclerview
林有工作RecyclerView,SyncAdapter并greenrobot eventbus
当我SyncAdapter完成syincing我发布一条消息到消息总线:
EventBus.getDefault().post(new EventMessagesRefreshed());
Run Code Online (Sandbox Code Playgroud)
在我的目标类中,我执行以下操作:
@Subscribe
public void onEvent(EventMessagesRefreshed event) {
this.init();
}
Run Code Online (Sandbox Code Playgroud)
在我的init()i中为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!
Run Code Online (Sandbox Code Playgroud)
接收事件的片段位于选项卡视图的内部.因此,当我不在正确的目标选项卡中时,有多个选项卡,有时还有消息总线中的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)
Run Code Online (Sandbox Code Playgroud)
所以我需要init()我的适配器,RecyclerView只有在RecyclerViewDataObserver注册时.
我怎样才能做到这一点?
小智 6
您需要注册数据观察器以侦听来自同步适配器的数据更改.
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();
}`
Run Code Online (Sandbox Code Playgroud)
适配器可以发布描述特定更改的各种事件.并非所有适配器都支持所有更改类型,如果没有更具体的数据,某些适配器可能会回退到通用的"更改内容"事件.
| 归档时间: |
|
| 查看次数: |
5945 次 |
| 最近记录: |