2016-03-14 56 views
4

林與RecyclerViewSyncAdaptergreenrobot eventbus 工作時我SyncAdapter完成syincing我發佈一條消息到消息總線:RecyclerView RecyclerViewDataObserver未註冊

EventBus.getDefault().post(new EventMessagesRefreshed()); 

在我的目標類別i執行以下操作:

@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! 

接收該事件的片段是內部的標籤視圖的。因此,有多個標籤,有時ofcourse的SyncAdapter職位EventMessagesRefreshed到消息總線時,不正確的目標選項卡,但因爲它是註冊它試圖調用init()和創建適配器,並將其設置爲RecyclerView IM。如果出現這種情況,我得到以下錯誤:

Could not dispatch event: class EventMessagesRefreshed to subscribing class class FragmentMessagesList 
java.lang.IllegalStateException: Observer [email protected]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()我的適配器,只有當RecyclerViewDataObserver註冊RecyclerView

我怎樣才能做到這一點?

回答

4

您需要註冊數據觀察員聽取同步適配器的數據變化。

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.

+0

我們應該利用這個後註銷後? – Majid

+0

是的,你應該。 https://stackoverflow.com/questions/10864853/when-exactly-is-it-leak-safe-to-use-anonymous-inner-classes – crgarridos