首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RecyclerView RecyclerViewDataObserver没有注册

RecyclerView RecyclerViewDataObserver没有注册
EN

Stack Overflow用户
提问于 2016-03-14 19:47:59
回答 1查看 11.3K关注 0票数 8

我和RecyclerViewSyncAdapter绿色机器人事件总线一起工作,当SyncAdapter完成时,我在消息总线中发布了一条消息:

代码语言:javascript
运行
复制
EventBus.getDefault().post(new EventMessagesRefreshed());

在我的目标类中,我做了以下工作:

代码语言:javascript
运行
复制
@Subscribe
public void onEvent(EventMessagesRefreshed event) {
    this.init();
}

在我的init()中,我为回收视图创建了适配器,并将其设置为:

代码语言:javascript
运行
复制
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。如果发生这种情况,我将得到以下错误:

代码语言:javascript
运行
复制
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

,我该怎么做?

EN

Stack Overflow用户

回答已采纳

发布于 2016-03-14 20:31:54

您需要注册数据观察者来监听来自同步适配器的数据更改。

mRecyclerViewAdapter.registerAdapterDataObserver(myObserver);

RecyclerView.AdapterDataObserver是您调用的通知方法的结果。因此,例如,如果在向适配器添加项之后调用notifyItemInserted(),那么onItemRangeInserted()将被调用

一个更详细的例子

代码语言:javascript
运行
复制
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();
}`

适配器可以发布描述特定更改的各种事件。并不是所有的适配器都支持所有的更改类型,如果没有更具体的数据,一些适配器可能会退回到一般的“更改”事件。

票数 8
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35996703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档